【问题标题】:C++ Out of scope delete operator of an object causes crash deallocating std::vector对象的 C++ 超出范围删除运算符导致崩溃解除分配 std::vector
【发布时间】:2017-09-12 15:54:54
【问题描述】:

我有一个问题,当我尝试删除手动分配的指针时,它会导致 SIGABRT,我无法找到原因的根源。这个类看起来像

class StreamMetadataReader {

protected:
    std::ifstream csvFile;
    std::vector<std::string> header;

public:
    bool openFile(const std::string& path);
};

该对象是使用new 运算符手动创建分配内存并存储在第三方库内存中:

auto* reader = new StreamMetadataReader;
vxSetNodeAttribute(
  node, VX_NODE_ATTRIBUTE_LOCAL_DATA_PTR, (void *) &reader, sizeof(StreamMetadataReader *)
);

并且指针地址在程序执行期间在函数周围传递。我可以将地址转换为对象类型并正确使用它。在程序结束时,我最后一次检索指针并调用 delete 运算符来释放内存,如下所示:

StreamMetadataReader *reader = nullptr;
vxQueryNode(
    node, VX_NODE_ATTRIBUTE_LOCAL_DATA_PTR, (void *) &reader, sizeof(StreamMetadataReader *)
);
if (reader != nullptr) {
    delete reader;
}

所以调试器说当默认析构函数试图释放std::vector&lt;std::string&gt; header;对象成员时执行停止。

也许有人知道这里出了什么问题? 我知道这不是这个确切问题的最佳实践解决方案。也许我这可能是某种智能指针(例如弱指针)的用例?

提前致谢。

【问题讨论】:

  • delete on nullptr 定义明确。你不需要检查它。
  • 你得到的地址和你创建的一样吗?
  • 我不知道VX_NODE_ATTRIBUTE_LOCAL_DATA_PTRvxQueryNode 做什么,但看起来它可能直接写入&amp;reader 的内存表示。这仅适用于 POD 类型,std::vector 不允许。
  • 您可以使用 Valgrind (Linux) 或 Application Verifier (Windows) 之类的工具吗?这确实闻到了内存损坏的味道(或者更简单地说,第三方库正在写它不应该写的地方)
  • 关于 manni66 的更多问题,您不仅验证了返回的相同指针,还添加了析构函数并在其上设置断点以确保您不会意外删除对象 两次 ?

标签: c++ c++11 memory new-operator delete-operator


【解决方案1】:

感谢大家的帮助,我最近才解决了我的问题,那是我的项目中有错误defines,导致我的程序编译时使用的头文件与我使用的共享库略有不同。我使用的库具有声明结构成员的预编译器条件。这会导致内存损坏,并且到处都出现错误的错误。

【讨论】:

    猜你喜欢
    • 2015-11-18
    • 2020-04-22
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多