c++ - 销毁后 C++ 的行为

标签 c++

我有一个从套接字连续读取的对象,如下所示:

void CSocketReader::ReadComplete ( )
{
 messageProcessor->ResponseReceived ( response );
 read ();
}

void CSocketReader::read()
{
 socket.read(response);
}

我的问题是,根据响应和协议(protocol),我正在执行 ResponseReceived 方法可能会导致删除 CSocketReader 对象。当 ResponseReceived 方法返回 this 指针指向的对象时,该对象将被删除(但出于某种我不知道的原因,即使在删除后 this 指针也不是 NULL!!)。接下来执行 read 方法,程序在 read 中崩溃。我如何才能可靠地检测到正在对象上执行的方法已被删除。

请帮忙。

最佳答案

this 指针在对象被析构后的值在 C++ 标准中是未定义的,因此 this 不是NULL - 不需要 C++ 为您将其设置为 NULL

如果 messageProcessor 对象破坏了调用它的 CSocketReader 对象,那么您的程序设计有点古怪。至少我会让 ResponseReceived 函数返回一个 bool ,如果它删除了 CSocketReader 则为 true ,这样你就可以:

if (!messageProcessor->ResponseReceived(response)) {
    return;
}

立即返回。但即使这样也可能不安全;你不应该以代码可以在被破坏的对象上执行的方式构建你的程序。

关于c++ - 销毁后 C++ 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1477072/

相关文章:

c++ - 理解代码的问题

c++ - 使用命名空间系统;在 Visual Studio 2013 中

c++ - 为什么这些 un​​icode 变量名称不能与 -fextended-identifiers 一起使用? «, » 和 ≠

c++ - 如何更新 CMFCRibbonBar 中的最近文件列表

c++ - 如何从 C++ 中的二进制文件中读取类

c++ - 使用 g++ 在终端中运行 .cpp 文件时出错

c# - 类型转换和继承的乐趣

Javadoc 文档就地呈现。可以在 IDE 中看到 pretty-print 文档吗?

c++ - 递归克隆图时的stackoverflow

c++ - 用数组进行字节交换?