gpt4 book ai didi

c++ - 当存储在 std::vector 属性中时,我可以删除析构函数中的指针吗?

转载 作者:太空宇宙 更新时间:2023-11-04 15:38:02 26 4
gpt4 key购买 nike

我不想使用智能指针。

这是我的代码。

CCOLFile *pCOLFile = CCOLManager::getInstance()->parseFile(strCOLPath); // returns instance of CCOLFile
// ...
pCOLFile->unload(); // hoping to comment this out, and use destructor instead.
delete pCOLFile;

struct CCOLFile
{
std::string m_strFilePath;
std::vector<CCOLEntry*> m_vecEntries;
};

void CCOLFile::unload(void)
{
for (auto pCOLEntry : m_vecEntries)
{
delete pCOLEntry;
}
m_vecEntries.clear();
}

在 C++ 中注释我对 CCOLFile::unload 的调用然后将代码从 CCOLFile::unload 方法移动到 CCOLFile 析构函数是否安全?

最佳答案

是 - 请参阅 C++ Super-FAQ section on Destructors .

但是,如果您将该代码移动到 dtor,或者让 dtor 调用 unload(),则需要确保您的“删除 pCOLEntry”不会引发异常。原因:如果确实如此,并且如果您的 CCOLFile dtor 由于堆栈展开而被调用,您将以异常中的异常结束;砰;不要那样做。

如果“删除 pCOLEntry”会抛出异常,则会出现另一个问题:您的 unload() 方法将在您的 CCOLFile 对象中以 gobbledegook 结束。特别是,只有一些 pCOLEntry 指针将被删除,它们现在将指向曾经是 CCOLEntry 对象但现在只是幽灵的尸体。我在 C++ 常见问题解答中称其为“幽灵指针”。这是一件坏事,因为您将来可能会使用那个 Ghost Pointer,然后您最终会得到一个“Wild Pointer”。坏事接踵而至。

你的代码还有很多其他问题:因为你已经避免使用智能指针(为什么?)你真的应该将你的用法包装在一个 try/catch block 中,或者至少在你的代码中添加 BIG FAT UGLY COMMENTS确保没有人做过任何可能引发异常的事情。基本上,如果在控制流到达您的 unload() 或“删除”调用之前有任何异常抛出,则所有 CCOLEntry 对象都将泄漏,并且可能更重要的是,它们的 dtor 中的任何期望的副作用都不会发生——关闭文件、解锁锁等等。注意:我不是在问您您的代码当前是否可以在该区域抛出异常 - 这只是问题的一小部分。关心的不仅仅是现在,而是 future 。其他人(可能在凌晨 3 点)将在其中某处添加一些代码,该代码将能够抛出异常。智能指针使这种情况变得无害,或者一个大胖丑陋的评论至少使它不太可能发生。

另一个考虑因素:您需要关注“所有权”以及复制构造函数和赋值运算符。 Rule of Three (which I coined in 1991, but which has been more recently been replaced by the Rule of Five or even better the Rule of Zero)告诉您如果您明确定义其中之一,您将需要所有这些,在本例中为 dtor。同样,智能指针可能会有所帮助。

另一件事:你对 (void) 的使用,例如,在 CCOLFile::unload(void)) 的定义中,至少被一些人认为是可憎的:-) :-) :-)

关于c++ - 当存储在 std::vector 属性中时,我可以删除析构函数中的指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28732250/

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