gpt4 book ai didi

c++ - 数组删除给出 EXC_BAD_ACCESS 错误

转载 作者:行者123 更新时间:2023-11-30 02:06:11 30 4
gpt4 key购买 nike

我有一个类 Foo 定义如下:

class Foo
{
public:
Foo(int num);
Foo(const Foo& other);
~Foo();

Foo& operator=(const Foo& other);
...

private:
string *fooArray;
void clearMemory();
...
}

Foo::Foo(int num)
{
fooArray = new string[num];
}

Foo::Foo(const Foo& other)
{
*this = other;
}

Foo::~Foo()
{
clearMemory();
}

Foo& operator=(const Foo& other)
{
clearMemory();
fooArray = new string[other.size]; // size is a private variable
memcpy(fooArray, other.fooArray, other.size * sizeof(string));
}

void Foo::someOtherFooFuncion(int newNum)
{
clearMemory(); // crash with Visual Studio, does not crash with g++, but g++ also
// crashes when destructor is called
fooArray = new string[newNum];
}

void Foo::clearMemory()
{
if(fooArray != NULL)
{
delete[] fooArray; // sometimes it crashes here with g++; it always crashes when
// compiling in Visual Studio
fooArray = NULL;
}
}

如代码注释中所述,它有时会让我崩溃。我已经尝试按照 GDB 中的步骤操作,我得到了

destructing Foo:
@0x7fff5fbff9b0
$26 = {
fooArray = 0x1001009d8,
...
}

然后到达delete[] fooArray,突然间

Foo(49858) malloc: *** error for object 0x100100990: pointer being freed was not allocated

不知道 0x100100990 来自哪里。

我意识到代码非常不完整,但我现在真的不知道从哪里开始寻找错误,并且想要一些关于可能导致 delete[] 的情况的提示> 错误。

编辑:

添加了 c'tor、d'tor 和赋值运算符。我远离 PC,因此代码可能不是 100% 准确。为 fooArray 赋值并访问它们工作得很好。

此外,我将非常感谢可能导致 delete[] 抛出错误的问题的一般列表,这样我至少可以知道在代码中查找的位置。

编辑 2:

所以我听从 Xeo 的建议使用 std::uninitialized_copy,现在代码可以正常工作并在 g++ 下编译。析构函数在 Visual Studio 中也能正常工作,但是以某种方式删除 someOtherFooFuncion 中的 fooArray 会使其崩溃。

还有其他想法吗?

最佳答案

确保您定义了复制构造函数和赋值运算符。他们将需要为 fooArray分配内存。如果您不定义复制构造函数和 operator=,编译器将为您生成它们。然而,编译器生成的只会复制 fooArray 指针,可能会导致双重 deletes

如果您已经定义了它们,请将相关代码添加到您的问题中。

编辑:我可以看到您的复制构造函数没有分配内存,而您的赋值运算符正在使用 memcpy()。两者都可能导致问题。

关于c++ - 数组删除给出 EXC_BAD_ACCESS 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8991293/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com