Сначала я хотел бы указать, что я использую компилятор 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 имеет какой-то конструктор копии по умолчанию, который он использует? Таким образом, мне не нужно беспокоиться о создании конструкторов копирования?
У вас нет проблем, потому что вам повезло. Я бы рекомендовал сразу купить кучу билетов на Powerball. –