指针无效 - 为什么?

时间:2011-12-15 13:14:17

标签: 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;
}

这只是代码的相关部分,基本上我想初始化buffer中的指针read_image()。在运行时,我试图释放堆时得到这个:

*** glibc detected *** ./main: free(): invalid pointer: 0x00007fff0648556c ***

我的方法出了什么问题?

3 个答案:

答案 0 :(得分:11)

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


对您的功能进行此修改将产生您想要的结果:

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

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


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

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

...

read_image (&buffer);

在上面我们给read_image指针本身的地址,在里面我们可以取消引用指针到指针来设置原始指针所指向的值。

原谅措辞,说实话我很累。


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

答案 1 :(得分:2)

void read_image(vector<unsigned char>* & buffer) { // passed by reference
    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;
}

答案 2 :(得分:2)

我想你想要创建可以容纳多个图像的缓冲区,否则我不知道为什么你需要一个向量。

如果我对你的要求的猜测是正确的,你应该做这样的事情 -

void read_image(vector<unsigned char*>& buffer,int size) { 
    char* p = new char[size];
    buffer.push_back(p);
}
void process_image_buffer(char* image_buffer) {
    // Do something with image_buffer
}
int main(int argc, char ** argv) {
    vector<unsigned char*> buffer;
    for all images
       // calculate the unknown size at runtime here e.g.by taking input from user
       read_image(buffer,size);

    // Do Image Processing
    // process each image buffer in a for loop
    for all images (i < buffer.size())
       process_image_buffer(buffer[i]);

    // Free all at end
    for all images (i < buffer.size()) 
       delete[] buffer[i];
    return 0;
}