Способ определить, указывает ли указатель на …, точно куда?

#c #pointers

#c #указатели

Вопрос:

 char* cc = "Something string like";
char* ccn = new char[2];
ccn[0] = 'a';
ccn[1] = '';
cout << cc;
  

Второй указатель, чтобы предотвратить утечку mem, должен быть delete[] ‘d, но как можно определить, действительно ли указатель указывает на new’d mem или нет (как тот, что в первой строке)? И где создается первая строка?

Комментарии:

1. Первым должно быть либо const char* cc = ... , либо char cc[] = ... .

Ответ №1:

Нет, вы не можете, и вам не следует проектировать свои приложения таким образом, который ожидает, что вы сможете это сделать. Повторяю ваш вопрос о том, где создается первая строка — ответ «где-нибудь, удобном для вашего компилятора» — это не указано стандартом C .

Очевидный способ обойти эту проблему — не использовать массивы символов, а использовать std::strings .

Комментарии:

1. Ну, технически вы могли бы, но это дало бы вам знания только для этой конкретной платформы, этого конкретного компилятора и этой конкретной версии компилятора, поэтому я не собираюсь подробно останавливаться на этом, поскольку это довольно плохо .

2. @Xeo на самом деле, даже для конкретной платформы это чревато проблемами. Это довольно подробно обсуждается в Effective C .

Ответ №2:

В стандартном C нет способа узнать только по необработанному указателю, как были распределены связанные ресурсы (если таковые имеются).

Возможно, вместо этого вы могли бы использовать интеллектуальные указатели, поскольку они передают информацию о владении ресурсом вместе с необработанным значением указателя. Например:

 template <typename T>
struct noop_deleter {
    void operator()(T *p) {}
};

boost::shared_array<const char> cc("Something string like", noop_deleter<char>());
boost::shared_array<char> ccn(new char[2]);

ccn[0] = 'a';
ccn[1] = 0;
cout << cc.get();