2014-01-02 2 views
1

Сначала я хотел бы указать, что я использую компилятор GNU GCC. Я использую Code :: Blocks как свою IDE, поэтому мне не нужно вводить весь компилятор в командную строку Windows DOS. Если бы я мог быть более конкретно о моем компиляторе, что обнаруживается в виде линии в нижней части Cod :: Blocks, когда я успешно компилируемыйДважды удалите динамически выделенную память?

mingw32-g++.exe -std=c++11 -g 

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

int* x; 
x = new int; 
delete x; 
delete x; 

У меня нет предупреждений или ошибок или сбоев. Из книги, в которой я изучаю C++, освобождение указателя на динамически выделенный патрон памяти можно выполнить только один раз, тогда указатель недействителен. Если вы снова будете использовать delete на том же указателе, тогда будут проблемы. Однако я не понимаю эту проблему.

Аналогично, если я передаю объект по значению функции, так что он неточно скопирован, я не получаю ошибки, если у меня нет конструктора копирования, чтобы обеспечить глубокую копию (используя необработанные указатели в объекте). Это означает, что когда функция возвращается, мелкая копия выходит из области видимости и вызывает ее деструктор (где я использую delete на указателе). Когда int main возвращается, исходный объект выходит из области видимости, его деструктор вызывается, и тот же мелкий скопированный указатель удаляется. Но у меня нет проблем.

Я пробовал найти документацию онлайн о компиляторе, который я использую, и не смог найти. Означает ли это, что компилятор mingw32 имеет какой-то конструктор копии по умолчанию, который он использует? Таким образом, мне не нужно беспокоиться о создании конструкторов копирования?

+1

У вас нет проблем, потому что вам повезло. Я бы рекомендовал сразу купить кучу билетов на Powerball. –

ответ

1

Документация по компилятору вряд ли будет полезна в этом случае: если она существует, она может отображать исключения из спецификации C++. Это спецификация C++, которая вам нужна здесь.

При удалении одного и того же указателя дважды результат - согласно спецификации C++ - undefined. Компилятор мог вообще что-либо сделать и соответствовать спецификации. Компилятору разрешено распознавать неисправность и выдавать сообщение об ошибке, или не распознавать неисправность и взорваться немедленно или позже. То, что ваш компилятор, похоже, работал на этот раз не является признаком того, что двойное удаление безопасно. Это может привести к удалению кучи, что приведет к сбою seg намного позже.

Если вы не определяете конструктор копирования, C++ определяет его для вас. Конструктор копии по умолчанию делает копию по порядку.

Если у вас есть тот же объект, на который указывают несколько указателей, например, вы используете, используйте std::smart_ptr.

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