2

我有一个类指针声明:

MyClass* a;

在销毁方法中,我有:

    if (a)
    {
        delete a;
        a= NULL;
    }

删除指针a时出现问题:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

问题的原因是什么,我该如何解决?

4

6 回答 6

4

使用您当前的声明:

MyClass* a;

a得到一个随机值。如果您以后再也没有给它一个有效值,例如:

a = new MyClass();

它将指向内存中的未知位置,很可能不是为您的程序保留的内存区域,因此当您尝试删除它时会出错。

避免这个问题的最简单方法是a在声明它时给出一个值:

MyClass* a = new MyClass();

或者,如果您在声明它时不能给它一个值(也许您还不知道),请将它分配给 null:

MyClass* a = 0;

顺便说一句,您可以if (a)从代码中删除测试 ( )。delete是对空指针的无操作。

于 2012-05-23T15:20:50.893 回答
2

除非您在此之后初始化了指向某物的指针:

MyClass* a;

指针a将保存一些随机值。所以你的测试

if (a) { }

将通过,您尝试删除一些随机内存位置。

您可以通过初始化指针来避免这种情况:

MyClass* a = 0;

其他选项是指向的对象已在别处删除并且指针未设置为0,或者它指向在堆栈上分配的对象。

正如在别处所指出的那样,您可以通过使用智能指针而不是首先使用裸指针来避免所有这些麻烦。我建议看看std::unique_ptr

于 2012-05-23T15:16:59.017 回答
2

使用智能指针释放内存。delete在应用程序代码中总是错误的。

于 2012-05-23T15:18:31.923 回答
1

你是如何分配a指向的内存的?如果你使用new[](为了创建一个数组MyClass),你必须用delete[] a;. 如果您分配它malloc()(在使用类时这可能是一个坏主意),您必须使用free().

如果你用 分配了内存new,你可能在其他地方出现了内存管理错误——例如,你可能已经 deallocated 了a,或者你写的东西超出了某个数组的范围。尝试使用 Valgrind 来调试内存问题。

于 2012-05-23T15:15:09.913 回答
1

你应该使用

MyClass* a = NULL;

在你的声明中。如果您从不实例化 a,则指针指向未定义的内存区域。当包含类的析构函数执行时,它会尝试到delete那个随机位置。

于 2012-05-23T15:16:43.510 回答
1

当你这样做时,MyClass* a;你声明一个指针而不分配任何内存。你不初始化它,a也不一定是NULL。因此,当您尝试删除它时,您的测试if (a)成功,但释放失败。你应该这样做,MyClass* a = NULL;或者MyClass* a(nullptr);如果你可以使用 C++11。(我假设在这种情况下您不会new在任何地方使用,因为您告诉我们您只声明了一个指针。)

于 2012-05-23T15:21:42.587 回答