删除指向数组的指针

时间:2015-05-05 23:27:54

标签: c++ arrays visual-c++ array-initialization

在我的一个大项目中,我遇到了删除没有指定大小初始化的数组的问题。
我写了一个简单的程序来检查出了什么问题,这是代码

#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;
}

正如您可以看到,在未明确定义大小的情况下初始化anotherPointer 当然,只有一条标记为进近的线路同时处于活动状态 在方法A输出看起来像(< crash>意味着程序意外结束)

 3 2 1 0 <crash> 

方法B输出为

 3 2 1 0 4 <crash> 

在方法C中,有时候输出为3 2 1 0,其他时间应用程序崩溃而不打印任何内容。

据我所知初始化没有指定数组的大小以不同的内存分配结束,但我不知道如何解决最终崩溃的应用程序的问题,这是我的问题。

我正在使用Visual Studio Pro 2013 Update 4(MSVC ++)

修改
如果除了明确指定大小之外没有解决该问题的解决方案,我的问题是 为什么在MSCC ++中实现“功能”呢?

1 个答案:

答案 0 :(得分:2)

目前,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中修复的。