В одном из моих больших проектов я столкнулся с проблемой удаления массивов, которые были инициализированы без заданного размера.
Я написал простую программу, чтобы проверить, что идет не так, вот код
#include "stdafx.h"
class Checker
{
public:
Checker()
:myI(i++){}
virtual ~Checker(){
printf("%i " , myI);
fflush(stdout);
}
private:
int myI;
static int i;
};
int Checker::i = 0;int _tmain(int argc, _TCHAR* argv[]){
Checker* somePointer;
Checker* anotherPointer;
somePointer = new Checker[4]{
Checker(), Checker(), Checker(), Checker()};
anotherPointer = new Checker[]{
Checker(), Checker(), Checker(), Checker()};
delete[] somePointer;
delete[] anotherPointer; //approach A
delete anotherPointer; //approach B
//in approach C anotherPointer is not deleted
return 0;
}
Как вы можете видеть, elsePointer инициализируется без явно определенного размера.
Конечно, только одна из линий, помеченных как подход, активна одновременно.
В подходе А вывод выглядит так (< crash> означает, что программа неожиданно завершается)
3 2 1 0 <crash>
В подходе B вывод
3 2 1 0 4 <crash>
В подходе C некоторое время выводится 3 2 1 0, а в другое время происходит сбой приложения без печати чего-либо.
Насколько я знаю, инициализация без указания размера массива заканчивается разным выделением памяти, но я не знаю, как решить проблему с приложением, которое вылетает в конце, и это мой вопрос.
Я использую Visual Studio Pro 2013, обновление 4 (MSVC ++)
РЕДАКТИРОВАТЬ
В случае, если нет решения этой проблемы, кроме явного указания размера, мой вопрос
Почему эта «особенность» вообще реализована в MSCC ++?
В настоящее время стандарт C ++ не позволяет размещать массивы без явно определенного размера (как вы можете в Java или C #). GCC C ++ и Clang выдают ошибку при попытке компилировать ваш код (даже в режиме C ++ 14). Visual Studio 2015 RC также производит error C3078: you cannot 'new' an array of unknown bounds
, Подводя итог, это не особенность, это ошибка в VS 2013, которая, по-видимому, была исправлена в VS 2015.