gpt4 book ai didi

c++ - 分配给 `delete[]` 的 `int*` 上的 `new` 给出 malloc 错误

转载 作者:行者123 更新时间:2023-11-28 02:04:59 27 4
gpt4 key购买 nike

根据我对 C++ 约定的理解,我有:

class BlockRepresentation : public FPRepresentation
{
private:
class Block
{
public:
int id;
int fpDimensions;
int* position; // pointers in question
int* blockDimensions; // pointers in question

~Block();
};
std::vector<Block> all_blocks;

public:
BlockRepresentation( int count, int dimensions, int volumn[] );
void AddBlock( int id, int position[], int dimensions[] );
std::string ToGPL();
};

AddBlock 中创建新 block 的位置:

void BlockRepresentation::AddBlock( int id, int position[], 
int dimensions[] )
{
Block newBlock;

newBlock.id = id;
newBlock.fpDimensions = fpDimensions;
newBlock.position = new int[fpDimensions]; // pointers in question
newBlock.blockDimensions = new int[fpDimensions]; // pointers in question

for (int i = 0; i < fpDimensions; ++i)
{
newBlock.position[i] = position[i];
newBlock.blockDimensions[i] = dimensions[i];
}

all_blocks.push_back( newBlock );
}

所以我有以下析构函数:

BlockRepresentation::Block::~Block()
{
delete[] position;
delete[] blockDimensions;
}

然后我得到:

rep_tests(11039,0x7fff71390000) malloc: *** error for object 0x7fe4fad00240: pointer being freed was not allocated

为什么我不应该 delete[] 这里的 2 个指针?

最佳答案

正如评论中指出的那样,你违反了三原则,而且违规非常明显:

{
Block newBlock;

// snip

all_blocks.push_back( newBlock );
}

当此函数返回时,newBlock 对象超出范围,其析构函数将删除所有ed 数组。

但是您push_back() 了这个对象。这会将对象的拷贝构造到 vector 中。因为您的 Block 没有定义复制构造函数,默认的复制构造函数只是复制所有指向 newed 数组的指针。

如果您以某种方式设法避免取消引用不再有效的指针,或者您从那次经历中幸存下来,那么您还没有脱离险境。这是因为,当 vector 被销毁时,它的 Block 被销毁,它们的析构函数将再次尝试 delete 相同的 new ed 之前已经deleted 的数组。

瞬间崩溃。

关于c++ - 分配给 `delete[]` 的 `int*` 上的 `new` 给出 malloc 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37892512/

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