gpt4 book ai didi

C++ 初始化程序不断地在同一内存位置创建新对象

转载 作者:行者123 更新时间:2023-11-27 22:56:37 25 4
gpt4 key购买 nike

我有一个简单的递归类型容器对象“Level”(例如一个目录,它可以包含多个自身),虽然我不确定这是否与这个问题有关。

//Level.h
class Level
{

public:

Level();
vector<Level*> SubLevels;
Level CreateSubLevel();
}

//Level.cpp
Level::Level()
{
SubLevels = vector<Level*>();
}

Level Level::CreateSubLevel()
{
Level NewLevel = Level();

SubLevels.push_back(&NewLevel);

return NewLevel;
}

如果然后在我的主循环中调用

//main.cpp
Level MasterLevel = Level();
MasterLevel.CreateSubLevel();
MasterLevel.CreateSubLevel();
MasterLevel.CreateSubLevel();

我发现 vector MasterLevel.SubLevels 确实包含三个指向 Level 对象的指针。但是,它们都是指向同一个地址的指针!

我不确定为什么会这样。我缺乏内存管理技能 - 但我怀疑这是因为每次调用 CreateSubLevel() 时都会创建一个新对象,但当 CreateSubLevel() 退出时它会被删除?我以为 ARC 会跟踪指向它的指针仍然存在的事实,但也许我错了?或者这完全是另一个问题?

我怎样才能最好地解决这个问题?

谢谢!

最佳答案

SubLevels 持有三个指向临时对象的指针。编译器选择每次都为临时对象重用相同的内存并不奇怪——为什么不呢?

如果你想正确地存储三个不同的 Level,你要么必须按值存储它们:

vector<Level> SubLevels;
SubLevels.push_back(Level());

或者实际分配Level:

vector<Level*> SubLevels;
SubLevels.push_back(new Level); // don't forget to delete!

关于C++ 初始化程序不断地在同一内存位置创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32387482/

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