将指针删除到数组



在我的一个大型项目中,我遇到了删除无指定尺寸的删除数组的问题。
我写了一个简单的程序来检查出了什么问题,这是代码

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

您可以看到另一个pointer是初始化的,没有明确定义的大小。
当然,只有标记为方法的线一次是活跃的。
在方法中,输出看起来像这样(< 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 中实现了该"功能"?

当前C 标准不允许在没有明确指定大小的情况下分配数组(就像您在Java或C#中可以一样)。GCC C 和Clang试图编译您的代码时都会出现错误(即使在C 14模式下)。Visual Studio 2015 RC还产生error C3078: you cannot 'new' an array of unknown bounds。总结,这不是一个功能,它是VS 2013中的错误

相关内容

  • 没有找到相关文章