类中的内存分配

时间:2014-05-09 10:11:05

标签: c++ memory-management

我尝试编写一个在调用时分配内存的类,并在范围的末尾销毁它,就像普通变量一样。

这是我做的:

class GetMem {
public:
    GetMem(UINT);
    ~GetMem();
    void *ptr;
    UINT size;
};

GetMem::GetMem(UINT lenght) {

    ptr = calloc(1, size);
    if (!ptr){
        MessageBox(hwnd, "cant alloc", "error", MB_OK);
        exit(0);
    }
    size = lenght;
}
GetMem::~GetMem() {
    free(ptr);
    size = 0;
}

尝试用它分配一些内存,所以我在每个中都放了一些printfs。它基本上工作,构造函数在我分配时调用,而析构函数在作用域结束时调用。当在相同的范围内使用分配的内存时,一切都运行良好,但如果我将地址传递给函数(线程)并从那里写入程序将崩溃(trigg断点)

经过多次测试,似乎总是一个随机的地方:

InternetReadFile();
InternetCloseHandle();
ZeroMemory();
and once in _LocaleUpdate class

厄勒我使用了calloc(),当我不再需要它时,只需将其释放即可。还有什么需要改变吗?

以下是我分配内存的方法:

GetMem mem(100000);
char *temp = (char *)mem.ptr;

2 个答案:

答案 0 :(得分:3)

更改

GetMem::GetMem(UINT lenght) {
    // up to now, value of size is indeterminate
    ptr = calloc(1, size); // undefined behavior using indeterminate value
    if (!ptr){
        MessageBox(hwnd, "cant alloc", "error", MB_OK);
        exit(0);
    }
    size = lenght;
}

GetMem::GetMem(UINT lenght) {
    size = lenght; // <- set size first before using it
    ptr = calloc(1, size);
    if (!ptr){
        MessageBox(hwnd, "cant alloc", "error", MB_OK);
        exit(0);
    }
}

答案 1 :(得分:3)

size目前已在使用地点进行了部门化:ptr = calloc(1, size);。这是未定义的行为

更改为ptr = calloc(1, size = lenght);