2013-10-10 4 views
1
int a; 
int *b; 
void test(int* target) 
{ 
    delete(target); 
} 
test(new int); // <-- It's ok, of course. 
test(&a); // <-- It raises assertion fail, of course, too. 

Учитывая следующий код. Единственное, что я знаю о target, - это указатель на целое число. Как я могу указать источник указателя аргумента?Как я могу указать источник аргумента указателя?

+0

Что вы подразумеваете под источником? – Annabelle

+1

У вас нет видимости того, как что-то было выделено. Это зависит от вас, чтобы отслеживать. – Joe

+3

Вы не можете сделать это надежно вообще. Вот почему ручное управление памятью сложно - и лучше всего избегать - в противном случае вы могли бы просто выбросить «if (safe_to_delete (ptr)) delete ptr;» и быть счастливым. – us2012

ответ

3

Вы не можете точно сказать, указывает ли указатель на начало действительной динамически распределенной части памяти.

Именно поэтому ручное управление памятью сложнее в первую очередь - для всего, что вы распределяете динамически, вам необходимо правильно определить, кто несет ответственность за создание и кто несет ответственность за удаление. Получение этого неправильного результата приводит к неопределенному поведению, segfaults и всем остальным типам ошибок с жесткими трассировками.

Помните, что C++ дает вам множество инструментов (RAII, интеллектуальные указатели, ...), которые делают управление ручной памятью ненужным, за исключением нескольких оставшихся случаев.

Смежные вопросы