- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个非常简单的类来处理回调。来电者要求经理回叫。只要调用者持有回调对象,它就一直有效。但是,一旦对象死亡,它的析构函数就会将管理器内部的指针设置为 NULL,这样它就知道在下次遇到它时将其丢弃。
...或者至少,这是我追求的基本理念。
class Manager{
public:
void executeOnList() { ... }
Callback requestCallback(Drawable * target){
Drawable ** ptr = list.add(target);
return Callback(ptr); // <-- the point of interest
}
private:
List list;
};
class Callback{
friend Manager;
private:
Callback(Drawable ** targetPtr){
drawablePtr = targetPtr;
}
public:
~Callback(){
(*drawablePtr) = NULL; // <-- dtor of interest
}
private:
Drawable ** drawablePtr;
};
我的问题是,Manager::requestCallback()
会在将结构返回给它的调用者之前调用 Callback
的析构函数吗?
如果是这种情况,是否有任何方法可以防止这种情况发生,同时(或多或少)保持 Callback
功能背后的基本思想?
最佳答案
堆栈中的每个对象在超出范围时都会自动销毁。也就是说,从概念上讲,临时对象在从函数返回时将超出范围。也就是说,当返回复制的对象时,编译器可能会忽略它,在这种情况下,返回语句中的临时对象似乎根本不存在。但是,复制省略是否发生是一种优化,并不能保证。
在你的情况下,仅仅依赖于析构函数似乎不起作用。然而,可能有用的是区分传递的临时对象和持有(命名或指向)的对象。基本思想是将指向指针视为对象拥有的资源,并仅在实际所有者被销毁(类似于 std::unique_ptr<T>
)或所有所有者被销毁(类似于 std::shared_ptr<T>
)时重置它。假设你可以使用右值引用,你可以把两种形式都弄对,否则你只能得到共享所有权的权利。
以下是单一所有权逻辑的简要概述:
class Callback{
friend Manager;
private:
Callback(Drawable ** targetPtr){
drawablePtr = targetPtr;
}
public:
Callback(Callback&& other):
drawablePtr(other.drawablePtr) {
other.drawablePtr = 0;
}
~Callback(){
if (drawablePtr) {
(*drawablePtr) = 0;
}
}
private:
Drawable ** drawablePtr;
};
如果您不能使用右值语义,实际上您仍然可以使用相同的逻辑,但是存在创建拷贝时“资源”被意外从命名对象中窃取的风险。使用移动构造函数可以避免这种风险。
关于c++ - 返回一个对象会调用它的析构函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18298336/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!