gpt4 book ai didi

c++ - 删除函数的奇怪行为(混合 C 和 C++)

转载 作者:太空宇宙 更新时间:2023-11-04 04:37:46 25 4
gpt4 key购买 nike

我正在调试一个程序,我发现一些数据在不应该被更改的地方被更改了。我使用 gdb 跟踪程序,发现目标数据在一些其他数据的 delete 函数中被更改!

起初我认为两个区域之间有一些内存重叠,但后来我检查了两个区域的开始和结束地址,它们没有重叠!只留下 delete 行!

这是发生这种情况的函数,不应更改的数据是 freemap 并且被释放的数据是 synthops:

void BasicBlock::free() {
cout << "freemap 2 : " << this->mfnlo_loc.chunk->freemap[2] << "\n";
cout << "freemap 59 : " << this->mfnlo_loc.chunk->freemap[59] << "\n";
cout << "freemap : " << &(this->mfnlo_loc.chunk->freemap) << "\t" << sizeof(this->mfnlo_loc.chunk->freemap)+&(this->mfnlo_loc.chunk->freemap) << "\n";
cout << "synthops : " << synthops << "\t" << synthops+sizeof(uopimpl_func_t)*count << "\n";
if (synthops)
{
delete[] synthops;
}
cout << "freemap 2 : " << (this->mfnlo_loc.chunk->freemap[2]) << "\n";
cout << "freemap 59 : " << this->mfnlo_loc.chunk->freemap[59] << "\n";
synthops = NULL;
::free(this);
}

输出是这样的:

freemap 2 : 1
freemap 59 : 1
freemap : 0x3319a50 0x3319a90
synthops : 0x3319d50 0x331acd0
freemap 2 : 0
freemap 59 : 0

显示freemapdelete行之后发生变化,也显示两者在内存中不重叠。

synthops 在另一个函数中分配如下:

bb.synthops = new uopimpl_func_t[bb.count];

为什么会这样?代码是 C 和 C++ 的混合,这意味着 newmalloc 的混合(但始终使用,没有 deletemalloc 例如)。这是这个的原因吗?或者是别的什么?

最佳答案

我的通灵调试技巧告诉我,对于 BasicBlock,您没有遵循三规则,特别是您省略了复制构造函数。然后您(浅层)复制了该对象(特别是 synthops 成员),然后导致双重删除,此时所有赌注都关闭了。

关于c++ - 删除函数的奇怪行为(混合 C 和 C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29381042/

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