C++ “之后做某事安全吗?”;删去这句话;如果;“有些事”;不需要访问;这是什么;?
例如,我有一个类,它有一个retain count和一个release方法,如果retain count为0,它可以删除self:C++ “之后做某事安全吗?”;删去这句话;如果;“有些事”;不需要访问;这是什么;?,c++,memory-management,undefined-behavior,retain-cycle,C++,Memory Management,Undefined Behavior,Retain Cycle,例如,我有一个类,它有一个retain count和一个release方法,如果retain count为0,它可以删除self: class MyClass{ public: void retain(){ this->retainCount++; } void release(){ this->retainCount--; if(this->retainCount==0){ de
class MyClass{
public:
void retain(){
this->retainCount++;
}
void release(){
this->retainCount--;
if(this->retainCount==0){
delete this;
}
printf("release called");
MyClass::deleteCount++;
FileOutputStream* fio=new FileOutputStream();
fio->generateLog();
delete fio;
EmailUtils::sendEmailAboutMemoryUsage();
}
protected:
int retainCount;
static int deleteCount;
}
删除对象后,我可能需要执行一些代码:
printf("release called");
MyClass::deleteCount++;
FileOutputStream* fio=new FileOutputStream();
fio->generateLog();
delete fio;
EmailUtils::sendEmailAboutMemoryUsage();
我的问题是,如果删除后的代码块不需要对此进行任何访问,那么在删除对象后继续执行代码是否安全?是,它是安全的。删除此时,代码不会被删除。但这是一件奇怪的事情。我的重击规则是:“谁创造了什么,谁就应该摧毁它”。我不喜欢在一个地方(代码中)创建东西(对象、数组等等),然后在其他地方销毁它们。这可能会导致错误和内存泄漏,并降低程序的可读性和可维护性。 只要你小心,一个物体自杀是可以的(不是邪恶的)(删除这个) 基本上,如果在
删除此
之后没有调用任何成员函数或访问任何成员变量,则可能是正常的
有关详细信息,请参阅链接。这是完美定义的行为,前提是您可以确保您的对象已分配了
新的
在这种情况下,它调用析构函数并释放与对象相关的内存,使成为一个悬空指针。由于您在删除后不访问它,因此代码中没有立即出现的问题
但您至少应该在该方法中添加一个强烈的通知,因为即使是安全的,您也应该警告未来的维护者两条现在无法打破的规则:
- 不要访问
此
,也不要在删除此
后访问非静态方法的任何成员变量
- 永远不要创建该类的非动态分配对象
你说的“安全”是什么意思?你是在问这是一种未定义的行为吗?或者它可能会在某个特定平台上爆炸?在我看来,隐藏的答案似乎是“使用std::shared_ptr
。确实如此,这实际上是Microsoft的组件对象模型(COM)使用的方法。