删除在另一个共享库中分配的指针

时间:2011-01-10 21:39:21

标签: c++ shared-libraries delete-operator

更新(已解决):好吧,我是完全白痴!原来在我的主程序中的“做数据的东西”部分我最终增加了指针,所以删除显然不起作用! D'哦!

所以我正在编译一个具有与此类似的功能的共享库(超简化视图),这个库也是我的 - 所以我知道如何分配数据:

// 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指针,因为数据可能是一个struct(因此可以转换为struct)。

问题是,我在我的主程序中使用这个指针,我想在完成后删除它。如果我在我的主程序中这样做:

// 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
}

但我仍然遭遇同样的崩溃!如果我不删除,一切都运行正常和花花公子,但我不希望在我的程序中出现不必要的内存泄漏。

我可能在某处做了一些愚蠢的事情 - 请帮助我以我的方式找到错误!

编辑:正如评论中指出的那样,上面的代码似乎有效 - 我将不得不看看我的代码中的错误是什么原因。

4 个答案:

答案 0 :(得分:2)

您是否尝试过使用valgrind?使用valgrind将帮助您查明各种内存管理错误,这可能是导致问题的原因。您看到的错误看起来像堆损坏(如@nos所说,可能在do stuff部分中),或者您实际上并没有释放最初分配的同一对象。

答案 1 :(得分:0)

如果库为您提供已分配的指针,则应解释如何释放它们。它可以提供自己的解除分配功能。除非您拥有库的源代码并且可以验证它是否使用new[]来创建指针,否则您无法确定它是如何分配内存的。您的崩溃可能是因为您的解除分配器与其分配器不匹配。

答案 2 :(得分:0)

如何使用更多基于RAII的设计,例如智能指针? Boost智能指针设计得非常好。

答案 3 :(得分:0)

我打赌你正在做类似的事情,就像你提到“演员阵容”一样:

#include <stdio.h>

class B { int x; };

class C { int y; };

class A : public B, public C { };

void* getData()
{
    A* a = new A();
    printf("%p\n", a);
    C* c = a;
    printf("%p\n", c);
    return c;
}

void deleteData(void* x)
{
    // delete (A*)x; // incorrect; causes crash
    delete (A*)(C*)x; // correct
}

int main()
{
    void* x = getData();
    deleteData(x);
    return 0;
}

请注意,编译器可能会将看起来像无辜的强制转换为背后的指针算法。