C ++ вызывает delete [] вызывает сбой - PullRequest
4 голосов
/ 20 сентября 2011

Я выделяю массив, а затем, когда я вызываю delete [], он вызывает сбой программы, программа работает нормально, когда я не вызываю delete.Вот мой код

MyObject *myArray= new MyObject[numPoints];
delete[] myArray;

Я очень запутался, поэтому любая помощь будет оценена48) в 0x000032E90. CRT обнаружил, что приложение записало в память после завершения буфера кучи. "

РЕШЕНИЕ !: Я инициализировал массив с недостаточно места.По какой-то причине я все еще мог добавить что-то в массив, но он вылетал, когда вызывался деструктор.

Ответы [ 3 ]

3 голосов
/ 20 сентября 2011

Мои умственные способности по отладке говорят мне, что, поскольку MyObject выполняет динамическое распределение, вы забыли подчиниться правилу трех ... вам не хватает конструктора копирования, оператора назначения копирования или обоих. Один пример см. http://drdobbs.com/184401400

Но так как это C ++, вы можете решить все свои проблемы, просто взамен vector. Пожалуйста, внимательно рассмотрите этот подход.

1 голос
/ 21 сентября 2011
EDIT: When i uncomment everythign in the MYObject deconstructor the program does not crash. The deconstructor code is :

delete [] myPoints;
points is an array in MyObject.

Подождите, что, вы выделяете массив MyObjects в конструкторе MyObject? Неудивительно, что у вас кончается куча, если вы рекурсивно выделяете массивы. По крайней мере, если я правильно понимаю, а вы имели в виду деструктор.

Если это не так, то в вашем классе MyObject все еще происходит что-то подозрительное. Либо в конструкторе или операторе new [], либо в операторе delete [].

1 голос
/ 20 сентября 2011

CRT detected that the application wrote to memory after end of heap buffer.
Обычно это означает, что вы написали после конца массива.
Решение 1: найдите все места, к которым вы обращаетесь к массиву, и вставьте утверждение, чтобы проверить, что индекс больше чемили равно нулю, а меньше numPoints.
Решение 2: заменить MyObject * на std::vector.(Сделай это)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...