C++ 双重自由或腐败(!prev)c++;opencv

C++ 双重自由或腐败(!prev)c++;opencv,c++,opencv,free,corruption,C++,Opencv,Free,Corruption,我正在实现一种分解图像的方法,它将图像作为输入并返回许多图像作为输出,称为BEMC。以下是我的主要函数,我尝试仅返回第一个BEMC: int main(int argc, char **argv) { if (argc != 2) { std::cout << "Usage: ./emd <image>" << std::endl; return 1; } cv::Mat inputImg; cv::Mat imgMode; inputImg

我正在实现一种分解图像的方法,它将图像作为输入并返回许多图像作为输出,称为BEMC。以下是我的主要函数,我尝试仅返回第一个BEMC:

int main(int argc, char **argv)
{
if (argc != 2) {
    std::cout << "Usage: ./emd <image>" << std::endl;
    return 1;
}
cv::Mat inputImg;
cv::Mat imgMode;

inputImg=imread(argv[1],CV_LOAD_IMAGE_COLOR); 

if(! inputImg.data )                             
{   cout <<  "Could not open or find the image" << std::endl ;
    return -1;
}
namedWindow("Source Image",WINDOW_AUTOSIZE);
imshow("Source Image",inputImg);
cv::waitKey(1000);

Mat gray;
cvtColor(inputImg,gray,COLOR_BGR2GRAY);
Mat grayy;
gray.convertTo(grayy, CV_32F);
sprintf(modeTitle, "BEMC-%d", 1);
std::cout << "Decomposition " << modeTitle << std::endl;
cv::Mat imgMod(grayy) , result;

imgMod = decompose(grayy); *************main.cpp:387********                                                 
//**** decompose is the function that generate the error******
...........................
...........................
}
程序在返回后崩溃,如图所示

*检测到glibc*/gdb_核心:双重释放或损坏(!prev):0x08c33d78***

这是一个gdb输出

  Program terminated with signal 6, Aborted.
  #0  0xb7738424 in __kernel_vsyscall ()

  thread apply all bt

 Thread 1 (Thread 0xb4282740 (LWP 3652)):
 #0  0xb773a424 in __kernel_vsyscall ()
 #1  0xb6f1f1df in __GI_raise (sig=6)
 at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
 #2  0xb6f22825 in __GI_abort () at abort.c:91
 #3  0xb6f5c39a in __libc_message (do_abort=2, 
 fmt=0xb70578e8 "*** glibc detected *** %s: %s: 0x%s ***\n")
 at ../sysdeps/unix/sysv/linux/libc_fatal.c:201
 #4  0xb6f66ee2 in malloc_printerr (action=<optimized out>, 
 str=<optimized out>, ptr=0x8c33d78) at malloc.c:5039
#5  0xb7549c22 in cv::fastFree(void*) ()
from /usr/local/lib/libopencv_core.so.2.4
#6  0xb763e78b in cv::Mat::deallocate() ()
from /usr/local/lib/libopencv_core.so.2.4
#7  0x0804c1fd in cv::Mat::release (this=0xbfda1fc8)
at /usr/local/include/opencv2/core/mat.hpp:367
#8  0x0804c055 in cv::Mat::~Mat (this=0xbfda1fc8, __in_chrg=<optimized out>)
at /usr/local/include/opencv2/core/mat.hpp:276
#9  0x0804b24c in decompose (input=...) at main.cpp:345
#10 0x0804b87f in main (argc=2, argv=0xbfda25a4) at main.cpp:387
程序以信号6终止,中止。
#内核vsyscall()中的0 0xb7738424
线程应用所有bt
螺纹1(螺纹0xb4282740(LWP 3652)):
#内核vsyscall()中的0 0xb773a424
#1个0xb6f1f1df处于上升状态(sig=6)
位于../nptl/sysdeps/unix/sysv/linux/raise.c:64
#2 0xb6f22825 in_uuugi_abort()位于abort.c:91
#3 0xb6f5c39a在\uuuu libc\u消息中(do\u abort=2,
fmt=0xb70578e8“***检测到glibc***%s:%s:0x%s***\n”)
在../sysdeps/unix/sysv/linux/libc_fatal.c:201
#malloc_printerr中的4 0xb6f66ee2(操作=,,
str=,ptr=0x8c33d78)在malloc.c:5039
#cv中的5 0xb7549c22::fastFree(void*)()
来自/usr/local/lib/libopencv_core.so.2.4
#cv::Mat::deallocate()中的6 0xb763e78b()
来自/usr/local/lib/libopencv_core.so.2.4
#cv::Mat::release中的7 0x0804c1fd(此=0xbfda1fc8)
at/usr/local/include/opencv2/core/mat.hpp:367
#cv::Mat::~Mat中的8 0x0804c055(this=0xbfda1fc8,uuu in_uchrg=)
at/usr/local/include/opencv2/core/mat.hpp:276
#main.cpp:345处分解(输入=…)中的9 0x0804b24c
#主管道中的10 0x0804b87f(argc=2,argv=0xbfda25a4)。cpp:387

我需要你的帮助,请

我知道已经有一段时间了,但我刚刚犯了完全相同的错误。我通过逐块注释找到了触发它的代码行

它是通过
cv::Mat::copyTo()
方法实现的。如果改用
cv::Mat::clone()
,则会触发相同的错误。我把它扔掉了,因为我真的不需要深度复制


我无法解释为什么会发生这种情况。如果您检查错误消息,它会说明有关释放内存的内容,但OpenCV应该注意这一点。

它看起来像是在堆栈上创建了
diff\u im
,因此它在创建它的函数之外不可用。相反,您应该使用
new
操作符在堆上创建
diff\u im
,然后返回指向它的指针。或者将函数更改为:
void decompose(cv::Mat input,cv::Mat&output)
@pgngp谢谢您的回复,我创建了diff\u im,就像
cv::Mat*diff=new cv::Mat(inputImg-imgMoyenne)
,我将方法的返回类型更改为
cv::Mat*分解(cv::Mat输入)
cv::Mat*imgMod=new cv::Mat(灰色);imgMod=分解(灰色);(主功能)
但我仍然有相同的error@incBrain感谢您的回复,我以前尝试过这种方法,现在也是在您的建议下尝试过,但仍然有相同的错误。@ImaneEL:您提到您创建了
diff_im
like
cv::Mat*diff=new cv::Mat(inputImg-imgmoyene)diff
而不是
diff\u im
。希望您在return语句中使用了正确的名称,对吗?
    cv::Mat  imgMoyenne //imgMoyenne is an image based on maximas,calculted  
                         in the program
    ....................
    cv::Mat diff_im;
    inputImg.copyTo(diff_im);
    diff_im = inputImg - imgMoyenne ;
    return diff_im;}*****************main.cpp:345**************
  Program terminated with signal 6, Aborted.
  #0  0xb7738424 in __kernel_vsyscall ()

  thread apply all bt

 Thread 1 (Thread 0xb4282740 (LWP 3652)):
 #0  0xb773a424 in __kernel_vsyscall ()
 #1  0xb6f1f1df in __GI_raise (sig=6)
 at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
 #2  0xb6f22825 in __GI_abort () at abort.c:91
 #3  0xb6f5c39a in __libc_message (do_abort=2, 
 fmt=0xb70578e8 "*** glibc detected *** %s: %s: 0x%s ***\n")
 at ../sysdeps/unix/sysv/linux/libc_fatal.c:201
 #4  0xb6f66ee2 in malloc_printerr (action=<optimized out>, 
 str=<optimized out>, ptr=0x8c33d78) at malloc.c:5039
#5  0xb7549c22 in cv::fastFree(void*) ()
from /usr/local/lib/libopencv_core.so.2.4
#6  0xb763e78b in cv::Mat::deallocate() ()
from /usr/local/lib/libopencv_core.so.2.4
#7  0x0804c1fd in cv::Mat::release (this=0xbfda1fc8)
at /usr/local/include/opencv2/core/mat.hpp:367
#8  0x0804c055 in cv::Mat::~Mat (this=0xbfda1fc8, __in_chrg=<optimized out>)
at /usr/local/include/opencv2/core/mat.hpp:276
#9  0x0804b24c in decompose (input=...) at main.cpp:345
#10 0x0804b87f in main (argc=2, argv=0xbfda25a4) at main.cpp:387