删除指向数组的指针
Deleting pointer to array
在我的一个大型项目中,我遇到了删除未指定大小的初始化数组的问题。
我写了一个简单的程序来检查出了什么问题,这是代码
#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 的初始化没有明确定义大小。
当然,一次只有一条标记为 approach 的行处于活动状态。
在 approach A 输出看起来像那样( 表示程序意外结束)
3 2 1 0 <crash>
在方法 B 中输出是
3 2 1 0 4 <crash>
在方法 C 中,有时输出为 3 2 1 0,有时应用程序崩溃而没有打印任何内容。
据我所知,没有指定数组大小的初始化以不同的内存分配结束,但我不知道如何解决最后崩溃的应用程序问题,这是我的问题。
我正在使用 Visual Studio Pro 2013 Update 4 (MSVC++)
编辑
如果除了明确指定大小之外没有解决该问题的方法,我的问题是
为什么 "feature" 完全在 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 中修复。
在我的一个大型项目中,我遇到了删除未指定大小的初始化数组的问题。
我写了一个简单的程序来检查出了什么问题,这是代码
#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 的初始化没有明确定义大小。
当然,一次只有一条标记为 approach 的行处于活动状态。
在 approach A 输出看起来像那样(
3 2 1 0 <crash>
在方法 B 中输出是
3 2 1 0 4 <crash>
在方法 C 中,有时输出为 3 2 1 0,有时应用程序崩溃而没有打印任何内容。
据我所知,没有指定数组大小的初始化以不同的内存分配结束,但我不知道如何解决最后崩溃的应用程序问题,这是我的问题。
我正在使用 Visual Studio Pro 2013 Update 4 (MSVC++)
编辑
如果除了明确指定大小之外没有解决该问题的方法,我的问题是
为什么 "feature" 完全在 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 中修复。