c++ - 删除指向数组的指针

标签 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++ 中实现?

最佳答案

当前 C++ 标准不允许在没有明确指定大小的情况下分配数组(就像在 Java 或 C# 中一样)。 GCC C++ 和 Clang 在尝试编译代码时都会出错(即使在 C++14 模式下)。 Visual Studio 2015 RC 还会产生错误 C3078:您无法“新建”未知边界的数组。总而言之,这不是一个功能,而是 VS 2013 中的一个错误,显然在 VS 2015 中已修复。

关于c++ - 删除指向数组的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30064909/

相关文章:

c++ - 选择返回零但有更多数据并且 recv 也有效

java - 使用星号制作条形图(处理负值)

javascript - 简单的无名 json 数组转换为映射的 JS 或 PHP 数组

java - 数组第二维初始化失败 - Java

visual-studio - MSVC 相当于 '__builtin_return_address'

c++ - 我需要帮助获得一个按钮来使用 arduino 激活有源蜂鸣器

c++ - 为什么你不能从一个元组中分配一个对,但元组可以从一个对中分配?

c++ - 在不同的范围内新建和删除

c++ - 从 C++ 调用 C 库

c++ - 错误 LNK2001 : unresolved external symbol "protected: static enum regex when upgrading from VS 2010 to VS 2017