c++ - 跟踪自动变量的生命周期?

标签 c++ scope

这可能是不可能的,但我想我会问...

有没有人能想到在不修改变量本身的类的情况下跟踪自动变量是否已被删除的方法?例如,考虑这段代码:

const char* pStringBuffer;
{
    std::string sString( "foo" );
    pStringBuffer = sString.c_str();
}

显然,在 block 之后,pStringBuffer 是一个可能有效也可能无效的悬挂指针。我想要的是一种包含 pStringBuffer(带有 const char* 的转换运算符)的包装类的方法,但断言它引用的变量仍然有效。通过更改引用变量的类型,我当然可以做到(例如提升 shared_ptr/weak_ptr),但我希望能够在不对引用类型施加限制的情况下做到这一点。

一些想法:

  • 我可能需要更改赋值语法以包含引用的变量(这很好)
  • 我也许能够查看堆栈指针以检测我的包装类是否比引用的类“晚”分配,但这看起来很老套而且不标准(C++ 没有定义堆栈行为)。不过,它可能会起作用。

想法/绝妙的解决方案?

最佳答案

一般来说,在 C++ 中根本不可能,因为指针太“原始”了。此外,查看您的分配是否晚于引用的类将不起作用,因为如果您更改字符串,则 c_str 指针可能会发生变化。

在这种特殊情况下,您可以检查字符串是否仍在为 c_str 返回相同的值。如果是,则您可能仍然有效,如果不是,则您的指针无效。

作为调试工具,我建议使用高级内存跟踪系统,如 valgrind(恐怕只适用于 linux。Windows 也有类似的程序,但我相信它们都要花钱。这个程序是我唯一的理由在我的 Mac 上安装了 Linux)。以您的程序执行速度慢得多为代价,valgrind 会检测您是否曾从无效指针读取数据。虽然它并不完美,但我发现它可以检测到许多错误,尤其是此类错误。

关于c++ - 跟踪自动变量的生命周期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/210506/

相关文章:

java - 编译时变量的名称和生命周期

c++ - 显式调用 DLL

C++ 试图读取带有错误逗号的格式错误的 CSV

c++ - mfc - 一次打开许多框架

python - 异或移位数生成

javascript - Javascript 中 "static"类型对象的正确结构

c++ - 在 vector 中搜索对象的任何实例时出错

c++ - 通过 id 访问 QML 槽中的嵌套对象(从 C++ 调用)

javascript - 将按钮单击附加到 webix 数据表

javascript - 跨文件的 Typescript 全局变量