Есть ли в моем коде неверный доступ к памяти?

Недавно в моем коде произошел сбой, когда я не был уверен в том, как и почему он произошел, и начал использовать статические анализаторы, затем я начал использовать Intel Inspector XE 2013. Я продолжал сталкиваться с тем же «Неверным доступом к памяти» в своем коде, поэтому Я начал сокращать свой код до наименьшей возможной формы, чтобы воспроизвести его, и, наконец, я дошел до того, что мне кажется, что в моем коде «Недопустимый доступ к памяти», но только если в моем классе есть деструктор. Интересно, что мой «Неверный доступ к памяти» происходит по адресу, который находится перед адресом, который он пытается удалить. Код, который закончился как «Недопустимый доступ к памяти», на самом деле не приводит к сбою моего кода, но я подумал, что смогу исправить эту потенциальную проблему, если бы она имела эффект снежного кома. Мой код в вопросе

class Group {
public:
Group() {}
~Group() {} // When this line is not here, there will not be an "Invalid memory access"};

int main() {
Group** groups = new Group*[3];

groups[0] = new Group();
groups[1] = new Group();
groups[2] = new Group();

for(unsigned int i = 0; i < 3; ++i)
delete [] groups[i];

delete [] groups;

return 0;
}

Проблема «Недопустимый доступ к памяти» будет отмечена при первой попытке «delete [] group [i]» (поэтому я буду равен 0). Адрес памяти, с которым он помечен, равен «0x003e30ec», где в качестве группы [0] фактически «0x003e30f0», что на 0x4 впереди. Всякий раз, когда я запускаю этот тест, он имеет разность 0x4.

У меня вопрос: действительно ли что-то не так с моим кодом, когда я неправильно читаю или записываю в память, или это просто плохой результат Intel Inspector XE 2013 (я нахожусь в Visual Studio 2012 Update 1)?

Для тех, кто интересуется моей таблицей памяти с приведенным выше примером, это следующее

groups == 0x003e30b8
groups[0] == 0x003e30f0
groups[1] == 0x003e3120
groups[2] == 0x003e3150

2

Решение

for(unsigned int i = 0; i < 3; ++i)
delete [] groups[i];

должно быть

for(unsigned int i = 0; i < 3; ++i)
delete  groups[i];

new/delete, new [] /delete [] должен всегда совпадать. В вашем случае просто используйте std::vector<std::shared_ptr<Group> > groups; будет лучше.

где я, наконец, добрался до точки, где кажется, что есть
«Неверный доступ к памяти» в моем коде, но только если мой класс имеет
деструктор.

с помощью wrong delete[] вот почему ваше приложение падает, в этом случае оно не имеет ничего общего с вашим деструктором, если только у вас нет чего-то скрытого в деструкторе, но это будет еще одна ошибка.

5

Другие решения

Я считаю, что ваша проблема в том, что вы используете стиль массива delete []и вы должны использовать только обычные delete, Это потому, что каждый элемент в groups это один Group объект, а не их массив.

Вы, однако, должны использовать delete [] для groups объем памяти.

1

По вопросам рекламы [email protected]