指针无效 - 为什么?

rdo*_*eui 4 c++ pointers

对C++不太熟悉,我有以下几点:

void read_image(vector<unsigned char>* buffer) {
    buffer = new vector<unsigned char>(2048);
}   

int main(int argc, char ** argv) {
    vector< unsigned char > *buffer;

    read_image(buffer);

    delete buffer; // gives invalid pointer at run-time

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这仅仅是代码的相关部分,基本上我要初始化的指针bufferread_image().在运行时我试图释放堆时得到这个:

*** glibc detected *** ./main: free(): invalid pointer: 0x00007fff0648556c ***
Run Code Online (Sandbox Code Playgroud)

我的做法有什么问题?

Fil*_*efp 11

您不是buffer通过引用发送(或作为指向vector<unsigned char>*) when callingread_image` 的指针,因此该函数无法将更新传播到函数外部(即调用者).


这个功能的修改将产生你想要的:

void read_image(vector<unsigned char>*& buffer) {
    buffer = new vector<unsigned char>(2048);
}   
Run Code Online (Sandbox Code Playgroud)

我们现在将引用作为参数传递给read_image,并且原始变量将使用返回的值进行更新new vector<...> (...).


如果你是指针狂热者,这也是有效的:

void read_image (vector<unsigned char>** buffer) {
    *buffer = new vector<unsigned char>(2048);
}  

...

read_image (&buffer);
Run Code Online (Sandbox Code Playgroud)

在上面我们给read_image指针本身的地址,在里面我们可以解除指向指针的指针,以设置原始指针指向的值.

请原谅我的说法,老实说我很累.


关于参考文献使用的常见问题.

  • 然而,真正的问题是他为什么要动态地分配一个`vector`.极少数情况下动态分配`vector`是有意义的. (2认同)