C++ glibc检测;内存损坏

C++ glibc检测;内存损坏,c++,memory-management,runtime-error,C++,Memory Management,Runtime Error,所以这很奇怪。。我使用的是卤化物(),但是我得到的错误是C++相关的。当我运行代码时,我得到 *** glibc detected *** ./lesson_04: malloc(): memory corruption: 0x0000000000a36640 *** 它还打印“实现”,但不打印“模糊初始值”。当我通过等于1.0的sigma时,它工作,但在2.0或3.0时不工作。这是一段较长的代码。较长的代码甚至不适用于1。我不明白一个值是如何影响任何东西的,以及它在哪里被卡住了。有什么帮助吗

所以这很奇怪。。我使用的是卤化物(),但是我得到的错误是C++相关的。当我运行代码时,我得到

*** glibc detected *** ./lesson_04: malloc(): memory corruption: 0x0000000000a36640 ***
它还打印“实现”,但不打印“模糊初始值”。当我通过等于1.0的sigma时,它工作,但在2.0或3.0时不工作。这是一段较长的代码。较长的代码甚至不适用于1。我不明白一个值是如何影响任何东西的,以及它在哪里被卡住了。有什么帮助吗? 谢谢

#包括
#包括
#包括
#包括“犰狳”
使用arma;
使用卤化物;
#包括“./apps/support/image\u io.h”
图像计算高斯(双西格玛){
int sigma=(int)sigmaD;
图像卷积(sigma*6+1,sigma*6+1);浮点和=0;

对于(int i=-sigma*3;i有时,如果程序过早退出,输出会卡在写缓冲区中,并且永远不会写入控制台。调用
fflush(stdout);
将帮助您确定是否是这种情况。或者使用
fprintf(stderr,…)
进行调试输出,因为
stderr
是无缓冲的

然而,更有可能的是,您的程序实际上在打印“实现”和“模糊初始值”之间的一个主要任务中崩溃,
Image
copy构造函数


我无法理解为什么要通过值传递并导致复制,我更希望使用
const
引用来避免复制大型对象。不过,如果复制构造函数中存在错误,那么一定要先找到并修复它。

有时输出会卡在写入缓冲区中,而不会真正写入con如果程序过早退出,则为唯一。调用
fflush(stdout);
将帮助您确定是否是这种情况。或者使用
fprintf(stderr,…)
进行调试输出,因为
stderr
是无缓冲的

然而,更有可能的是,您的程序实际上在打印“实现”和“模糊初始值”之间的一个主要任务中崩溃,
Image
copy构造函数


为什么你要通过值并导致拷贝,我更喜欢一个<代码> const <代码>引用,以避免复制一个大对象。但是,如果你在复制构造函数中有一个bug,它肯定是值得先找到和修复的。< / P>对不起,我对C++是很新的。你指的是const引用?@安德列:例如,改变函数签名到代码>图像模糊高斯(const Isand IM,浮点Sigma)< /C> >这似乎没什么帮助(抱歉,我对C++是很新的。你是指const引用?”安德列:例如,将函数签名改为<代码>图像模糊高斯(const Isand IM,Sigma Sigma)< /Cord>这似乎没有帮助。(您是否在调试器(gdb)中运行了该程序?“blur initial”可能不会被打印,因为行尾没有“\n”,所以不会被刷新。您是否在调试器(gdb)中运行了该程序?“blur initial”可能不会被打印,因为行尾没有“\n”,所以不会被刷新。

#include <Halide.h>
#include <stdio.h>
#include <math.h>

#include "armadillo"
using namespace arma;

using namespace Halide;
#include "../apps/support/image_io.h"


Image<float> calculateGaussian(double sigmaD){
    int sigma=(int)sigmaD;
    Image<float> convolution(sigma*6+1,sigma*6+1); float sum=0;

    for (int i=-sigma*3; i<sigma*3+2; i++){
        for (int j=-sigma*3; j<sigma*3+2; j++){
            float r=std::sqrt(i*i+j*j);
            convolution(i+sigma*3,j+sigma*3)=std::exp(-r*r/(2*sigma*sigma));
            sum+=convolution(i+sigma*3,j+sigma*3);
        }
    }
    for (int i=0; i<sigma*6+1; i++){
        for (int j=0; j<sigma*6+1; j++){
            convolution(i,j)/=sum;
        }
    }
    return convolution;
}

Image<uint8_t> convolve(Image<uint8_t> im, Image<float> convolution){
    RDom r(convolution);
    int w=convolution.width(), h=convolution.height();
    int W=im.width(), H=im.height();
    Var x,y,c;
    Func blur, input;
    input(x, y,c) = im(clamp(x, 0, W-1), clamp(y, 0, H-1),c);   
    blur(x, y,c) = sum(cast<uint8_t>(convolution(r.x, r.y) * input(x + r.x - w/2, y + r.y - h/2,c)));
    Image<uint8_t> out=blur.realize(im.width(),im.height(),im.channels());
    return out;
}

Image<uint8_t> blurGaussian(Image<uint8_t> im, float sigma){
    printf("blur initial");
    Image<float> gaussian=calculateGaussian(sigma);

    return convolve(im,gaussian);
}

int main(int argc, char **argv) {

    Image<uint8_t> im1 = load<uint8_t>("../apps/images/stata-1.png");
    Image<uint8_t> output;
    printf("realizing \n");
    output=blurGaussian(im1,3.0);
    save(output, "blur.png");

    printf("Success!\n");
    return 0;
}