【发布时间】:2011-06-06 19:29:07
【问题描述】:
更新(已解决):好吧,我是一个完全白痴!结果在我的主程序的“用数据做东西”部分我最终增加了指针,所以删除显然不起作用!哦!
所以我正在编译一个共享库,它的功能类似于这个(超级简化视图),这个库也是我的——所以我知道数据是如何分配的:
// inside library
void* getData(int size) { // with other parameters
UINT8* data = new UINT8[size]; // where typedef uint8_t UINT8; for gcc
// do a socket read, where data is the buffer
blockingRead (someSocket, data, propertySize);
return (void*) data;
}
它必须返回一个 void 指针,因为数据可能是一个结构体(因此可以直接转换为结构体)。
问题是,我在我的主程序中使用了这个指针,我想在完成后删除它。如果我在我的主程序中这样做:
// inside main program
char* data = (char*) Library::getData(5);
// do stuff with data
delete[] data; // crashes with:
// *** glibc detected *** core: free(): invalid pointer: 0x00002aaab007bca4 ***
我想也许我应该在共享库中删除它:
// inside library
void disposeData(void* data) { // call this from main program
delete[] (UINT8*) data; // cast it back to the original type of pointer
}
但我仍然遇到同样的崩溃!如果我不删除,一切都会正常运行,但我不希望整个程序出现不必要的内存泄漏。
我可能在某个地方做了一些愚蠢的事情——请帮我找出我的方法中的错误!
编辑:正如 cmets 中所指出的,上面的代码似乎有效——我将不得不看看是什么具体导致了我的代码中的错误。
【问题讨论】:
-
我认为您需要创建一个最小示例来展示您的问题。我已经用 g++ 尝试过你的代码,它运行得很好......没有崩溃。
-
谢谢诺亚!嗯,我想还有更多...我会调查
-
您的问题可能出在
// do stuff with data部分,所以也粘贴一下。您没有删除与Library::getData(5)返回相同的指针(可能是因为缓冲区溢出,或者您在某处为data分配了其他内容) -
您是否已经删除了数据并且您正在尝试再次删除它?
-
谢谢大家!事实证明 nos 是对的,我在“用数据做事”部分增加了指针!啊,对不起,伙计们哈哈
标签: c++ shared-libraries delete-operator