【发布时间】: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<std::string> header;对象成员时执行停止。
也许有人知道这里出了什么问题? 我知道这不是这个确切问题的最佳实践解决方案。也许我这可能是某种智能指针(例如弱指针)的用例?
提前致谢。
【问题讨论】:
-
deleteonnullptr定义明确。你不需要检查它。 -
你得到的地址和你创建的一样吗?
-
我不知道
VX_NODE_ATTRIBUTE_LOCAL_DATA_PTR或vxQueryNode做什么,但看起来它可能直接写入&reader的内存表示。这仅适用于 POD 类型,std::vector不允许。 -
您可以使用 Valgrind (Linux) 或 Application Verifier (Windows) 之类的工具吗?这确实闻到了内存损坏的味道(或者更简单地说,第三方库正在写它不应该写的地方)
-
关于 manni66 的更多问题,您不仅验证了返回的相同指针,还添加了析构函数并在其上设置断点以确保您不会意外删除对象 两次 ?
标签: c++ c++11 memory new-operator delete-operator