Способ обнаружить, если указатель указывает на ..., где именно? - PullRequest
0 голосов
/ 01 мая 2011
char* cc = "Something string like";
char* ccn = new char[2];
ccn[0] = 'a';
ccn[1] = '\0';
cout << cc;

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

Ответы [ 2 ]

8 голосов
/ 01 мая 2011

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

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

0 голосов
/ 01 мая 2011

В стандартном 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...