对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 ***
我的方法出了什么问题?
答案 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;
}