#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();