- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我不想使用智能指针。
这是我的代码。
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/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!