Как мы узнаем, был ли указатель выделен с помощью new или new[]?

#c

Вопрос:

Я пытаюсь реализовать класс unique_ptr в C , но как узнать, был ли указатель, который мы ему передали, выделен с new использованием или new[] без использования default_delete (мой школьный стандарт не разрешает c 11). Я имею в виду, когда вы передаете указатель на конструктор, например, так:

 unique_ptrlt;intgt; ptr(new int[10]);  

как вы узнаете внутри класса, нужно ли вам звонить delete[] или delete ?

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

1. Попробуйте вместо этого использовать интеллектуальный unique_ptr для массива: unique_ptrlt;int[]gt; ptr(new int[10]);

2. Я пытался, но он не компилировался

Ответ №1:

Ты не можешь сказать. И никто не может std::unique_ptr .

Подумайте об этом. Если бы это можно было определить автоматически, вам не понадобились бы два вида delete .

std::unique_ptrlt;intgt; ptr(new int[10]); это неправильно, так как он будет звонить delete , а не delete[] .

Используйте std::unique_ptrlt;int[]gt; ptr(new int[10]); вместо этого, что вызовет delete[] , а не delete .

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

1. Хорошо, так есть ли smart_ptrs для массивов?

2. unique_ptrlt;type[]gt; смотрите также поиск в Google «unique_ptr для массива»