C++ 对象的超出范围删除运算符导致崩溃解除分配 std::vector
C++ Out of scope delete operator of an object causes crash deallocating std::vector
我有一个问题,当我尝试删除手动分配的指针时,它会导致 SIGABRT,我无法找出原因的根源。 class 看起来像
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;
对象成员时执行停止。
也许有人知道这里出了什么问题?
我知道这不是针对这个确切问题的最佳实践解决方案。也许我这可能是某种智能指针(例如弱指针)的用例?
提前致谢。
感谢大家的帮助,我最近才解决了我的问题,那是我在我的项目中 defines
错误,导致我的程序编译时的头文件与共享的头文件略有不同我用过的图书馆。我使用的库具有预编译器条件来声明结构成员。这导致内存损坏和错误无处不在。
我有一个问题,当我尝试删除手动分配的指针时,它会导致 SIGABRT,我无法找出原因的根源。 class 看起来像
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;
对象成员时执行停止。
也许有人知道这里出了什么问题? 我知道这不是针对这个确切问题的最佳实践解决方案。也许我这可能是某种智能指针(例如弱指针)的用例?
提前致谢。
感谢大家的帮助,我最近才解决了我的问题,那是我在我的项目中 defines
错误,导致我的程序编译时的头文件与共享的头文件略有不同我用过的图书馆。我使用的库具有预编译器条件来声明结构成员。这导致内存损坏和错误无处不在。