繁体   English   中英

是否应该在Windows DLL库中导出析构函数?

Should destructors be exported in Windows DLL Libraries?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

在生成Windows DLL动态库时,系统会要求您声明应导出哪些函数,以便某些函数可能保留为DLL专用而其他应用程序无法访问。

我还没有看到有关是否需要导出析构函数或是否由编译器或Windows内核自动处理的任何内容? 如果我不导出析构函数并且它们动态分配我声明为可导出的类,如果不导出析构函数,它们是否可以成功调用delete?

2 个回复

通常,任何带有构造函数的类都应该导出析构函数。

话虽这么说,但有几件事要警惕......

如果您在Windows上构建,则需要注意将VS版本与库混合。 如果您只是将您的库作为DLL分发,那么导出构造函数和析构函数是个坏主意。 问题出在C ++运行时。 几乎需要处理内存分配的相同运行时需要处理释放。 例如,当您尝试在VS 2008中使用在VS 2005中编译的库时,这是“坏事”的首要原因。

解决方案是提供工厂方法来创建类(分配由您编译的运行时处理)以及删除/破坏类的方法(因此解除分配在同一运行时发生)。

如果析构函数不可用但需要,编译器应该生成错误。 作为一般规则,如果导出构造函数,那么析构函数也应该是。

1 什么应该在适当的析构函数?

我知道析构函数本质上是一个释放内存的函数,或者只要你完成它就会“清理”。 我的问题是,正确的析构函数是什么? 让我给你看一些我所拥有的课程的代码: 这是构造函数: 在我的析构函数类中,我应该在指针后清理吗? 也就是说,将它们设置为NULL? 或删除它们? 即 ...

2 函数/常量/变量是否应该在`package main`中导出?

我正在开发一个只有一个package main 的小项目 。 AFAIK,小型Golang二进制项目的最佳实践是将所有代码都放在一个( main )命名空间中 ,这就是我所做的。 只是好奇,在package main ,最好的方法是保持函数/常量/变量导出( MyFunction )还是 ...

2016-09-18 16:31:57 2 75   go
3 我应该在此类中构建析构函数吗?

我目前正在使用C ++构建ABM模型。 我有一些需要相互交互的类,因为例如,类B需要检查类A中的值并返回一些对它的求值,然后类C可能希望读取它。 类不必更改其他类的值,而只需从它们中读取即可。 在我当前的实现中,类B对包含类A的所有成员的向量有一个指针。指针的存在有两个原因:简化该 ...

4 我应该在类的析构函数中删除QPointer吗?

假设我有一个类如下的类: 我是否需要手动删除m_process ,如析构函数中所示? 不幸的是,我不能使用std::unique_ptr或std::shared_ptr 我还没有看到QObject::connect的正确重载。 另一方面,在QPointer :: ~Q ...

5 什么应该在类的析构函数中删除

自从我完成了所有c ++编码以来,已经有一段时间了,我只是想知道基本链接列表中的哪些变量应该在析构函数中删除,但是不幸的是,目前我无法参考我的c ++手册。 链接列表类如下所示: 我也很好奇,如果我在析构函数中打电话给我 那会去链接列表的下一个节点并删除该节点,从而从那一点递归 ...

6 指向“原始”资源的指针是否应该在析构函数中归零?

当我将“原始”资源包装到C ++类中时,在析构函数代码中,我通常只释放分配的资源,而不关注诸如归零指针等其他步骤,例如: 我想知道这种代码样式是否包含潜在的错误 :即,析构函数是否可能被多次调用? 在这种情况下,在析构函数中要做的正确的事情是清除指针以避免两次/多次破坏: 可以 ...

8 当类同时包装STL容器和指针时,是否应该在类的析构函数中销毁STL容器?

我有点理解这样的事实,当该类的实例超出范围时,该类的包装STL容器将被自动销毁。 因此,当类仅包装STL容器时,我不必编写析构函数。 但是,如果该类还必须管理一些指针,该怎么办? 在某些CUDA开发中,我想要一个类来处理设备指针和STL容器。 在上述情况下,我需要析构函数为da ...

9 是否应该在stl容器调用其值的析构函数之前或之后结束所有权?

在以下代码中,X在全局容器中注册,该容器成为其共享所有者。 X的析构函数测试它不再是这种所有权的一部分了,我希望它是被破坏的有效前提条件。 当它运行时(在使用VS2010编译之后),当清除容器时抛出“Oops ...”。 问题: 这段代码合法吗? 如果没有,为什么不呢 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM