- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
This page检查并给出了一个非常清晰的示例,说明如何动态加载和使用类,但有些东西我很难理解:
我明白为什么需要“创建”功能,但为什么需要“销毁”功能?为什么不将接口(interface)析构函数声明为纯虚拟的就足够了?
我做了一个相同的例子,除了:
~polygon() = 0;
triangle
的析构函数是:
triangle::~triangle() {
std::cout << "triangle Dtor is called" <<std::endl;
}
然后当我使用:
delete poly;
确实显示了消息(Linux 下的 GCC 5.4.0)。
我试图寻找其他示例,但他们都提到并使用了“销毁”功能,没有使用简单的纯虚拟析构函数的示例,这让人相信我在这里遗漏了一些东西,所以..它是什么?
不想使用 destroy 函数的背景是我想在 shared_ptr
中使用分配的对象并且以后不关心它的生命周期,使用“destroy”函数会很棘手,因此我需要知道是否有必要。
最佳答案
在 the same link 中进一步阅读:
You must provide both a creation and a destruction function; you must not destroy the instances using delete from inside the executable, but always pass it back to the module. This is due to the fact that in C++ the operators new and delete may be overloaded; this would cause a non-matching new and delete to be called, which could cause anything from nothing to memory leaks and segmentation faults. The same is true if different standard libraries are used to link the module and the executable.
此处的关键字是 new 和 delete 可能会被重载
,因此如果您使用 delete
,则在调用者的代码中执行的操作与在共享对象的代码中执行的操作不同> 从二进制文件内部调用析构函数,并根据共享对象中的析构函数释放内存,但这可能不是共享对象中 delete 运算符的行为,可能是 new
共享对象没有分配任何内存,因此您可能会遇到段错误,也许 new
正在做的事情不仅仅是为该对象分配内存并且不调用匹配的 delete
共享对象中存在泄漏,共享对象和二进制文件之间也可能存在不同的堆处理。
在任何情况下,shared_ptr
都可以通过调用自定义删除器的 lambda 函数相当轻松地获得自定义删除器;是的,shared_ptr
不能在其模板参数中包含删除器,这有点烦人,但您可以编写一个简单的包装器,使其更简单/更简洁,以在所有位置使用一致的删除器创建它(目前没有可用的编译器,请原谅任何拼写错误):
shared_ptr<triangle> make_shared_triangle(triangle *t) {
return std::shared_ptr<triangle>(t, [](triangle *t) { destroy_triangle(t); });
}
关于C++动态加载类: Why is a "destroy" function needed?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40109135/
我有两个类(class): parent 和 child child : belongs_to :parent 和 家长 has_many :children, :dependent => :dest
我有这个模型 class XmlImport ["text/xml"] end :event_import_records 条目正在被销毁。但是 :events 不是。 has_many throu
我定义了以下简单的管道: image: name: hashicorp/terraform:light entrypoint: - '/usr/bin/env' - 'PATH
我定义了以下简单的管道: image: name: hashicorp/terraform:light entrypoint: - '/usr/bin/env' - 'PATH
在我们的应用程序中,我们覆盖了 ActiveRecord destroy 方法,以便我们的记录不会被删除(因此用户可以取消删除)。像这样: def destroy self.is_deleted
我有一个笔记模型,具有以下关联 注意.rb has_many :note_categories, :dependent => :destroy has_many :categories, :throu
我是一名 Python 初学者。尝试制作一个新按钮来关闭窗口。我收到错误消息: Exception in Tkinter callback Traceback (most recent call la
我在我的应用程序中添加了评论功能,到目前为止一切正常,直到出现此错误。我所做的是添加了删除评论功能。当我启动服务器时一切正常,但在我单击“删除”按钮后问题出现了。 错误信息 undefined loc
Rails,def destroy,没有响应 destroy.js.erb 这是我的方法: # DELETE /Groups/1 # DELETE /Groups/1.xml def de
假设我有一个 MyClass 对象的集合 MyCollection。 Set MyCollection = Nothing 是否调用每个包含的对象的析构函数,或者我应该单独设置每个对象 = Nothi
我正在尝试使用 Node.js、Express 和 Mongodb 构建 REST API。我正在使用 mongodb npm 包连接到数据库,下面是我的 sever.js 文件代码 var expr
我有一个小问题,我有以下两个模型: class CriticalProcess :destroy has_many :roles, :through => :authorizations a
我正在使用 ng2-toastr 并收到以下错误 https://www.npmjs.com/package/ng2-toastr Attempt to use a destroyed view: d
基本信息: 系统: # cat /proc/version Linux version 3.10.0-514.2.2.el7.x86_64 (builder@kbuilder.dev.centos.o
一 点睛 destroy 用于销毁 ThreadGroup,该方法只是针对一个没有任何 active 线程的 group 进行一次 destroy 标记,调用该方法的直接结果是在父 group 中将自
我开始注意到 Scope::Guard 的一些奇怪之处。 . 如果我取消定义 $guard变量作为 sub 中的最后一个语句,守卫的 sub 得到 比我预期的要晚打电话。 如果我不取消它,或者如果我做
我正在构建一个提供打开和关闭它的服务的模式。该模式有一个控制关闭按钮的小 Controller ,以及进入模式内容的模板的 $compile。 那个模板就是一个组件,当然,那个组件有一个 Contro
一直在文件馆和网上寻找答案,但没有真正找到答案,只是零零碎碎。似乎有很多建议的帖子,但没有一个有答案。 我有一个使用范围的复杂指令:true。它实际上是我正在尝试为其编写清理代码的 ng-grid 最
给定以下 Delphi 代码,Foo 在 FormClose 上是 Free,但 TFoo.Destroy 是没有被调用 - 因此 Bar 没有被 Free'd,导致内存泄漏? 我是否在这里错过了一些
https://docs.angularjs.org/guide/directive By listening to this event, you can remove event listener
我是一名优秀的程序员,十分优秀!