运行 C++ 代码时出现分段错误

Posted

技术标签:

【中文标题】运行 C++ 代码时出现分段错误【英文标题】:Segmentation fault when running c++ code 【发布时间】:2014-08-03 13:16:46 【问题描述】:

前段时间,我问了一个关于堆栈溢出的问题,关于如何在 linux 中使用 c++ 快速截屏。我用g++ main.cpp -std=c++0x -o app 'pkg-config --cflags --libs openCV' 编译了该代码(如下所示)。它编译成功,但是,当我尝试运行该程序时,它会导致分段错误。我对 c++ 和 openCV 很陌生,所以我真的不知道该怎么做。是我的代码错误还是其他原因?

如果我错过了解决此错误所需的细节,我深表歉意,如果我错过了,请通过评论告诉我。

#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <cstdint>
#include <cstring>
#include <vector>
#include "/usr/local/include/opencv2/opencv.hpp"

using namespace cv;

void ImageFromDisplay(std::vector<uint8_t>& Pixels, int& Width, int& Height, int& BitsPerPixel)

    Display* display = XOpenDisplay(nullptr);
    Window root = DefaultRootWindow(display);

    XWindowAttributes attributes = 0;
    XGetWindowAttributes(display, root, &attributes);

    Width = attributes.width;
    Height = attributes.height;

    XImage* img = XGetImage(display, root, 0, 0 , Width, Height, AllPlanes, ZPixmap);
    BitsPerPixel = img->bits_per_pixel;
    Pixels.resize(((((Width * Height) + 31) & ~31) / 8) * Height);

    memcpy(&Pixels[0], img->data, Pixels.size());

    XFree(img);
    XCloseDisplay(display);



int main()

    int Width = 0;
    int Height = 0;
    int Bpp = 0;
    std::vector<std::uint8_t> Pixels;

    ImageFromDisplay(Pixels, Width, Height, Bpp);

    if (Width && Height)
    
        Mat img = Mat(Height, Width, Bpp > 24 ? CV_8UC4 : CV_8UC3, &Pixels[0]); //Mat(Size(Height, Width), Bpp > 24 ? CV_8UC4 : CV_8UC3, &Pixels[0]); 

        namedWindow("WindowTitle", WINDOW_AUTOSIZE);
        imshow("Display window", img);

        waitKey(0);
    
    return 0;

【问题讨论】:

你检查过Pixels不为空吗? 先使用调试器,再问这里... 检查这些函数中的 几个 是否存在潜在故障,同时评估 成功 执行返回的数据值,可能会带来很大的好处。 Don't Break Commandment #6 img-&gt;data 是否包含Pixels.size() 的数据?你应该断言这一点。 根据我在有符号整数上使用~ 的经验会导致麻烦。你想用~31做什么? 【参考方案1】:

假设有width * height 像素,每个像素都有bits_per_pixel 位。然后 img->data 包含(width * height * bits_per_pixel) / CHAR_BIT 字节。

但是您正在尝试从img-&gt;data 中读取(大约)(width * height * height) / 8,这是没有意义的。

将其更改为(width * height * bits_per_pixel) / CHAR_BIT

【讨论】:

以上是关于运行 C++ 代码时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中比较来自向量的字符串时出现分段错误

在 C++ 中使用向量时出现分段错误

分段错误:在 C++ 中弹出向量时出现 11

使用 ctypes 时出现分段错误

删除时出现分段错误

我运行程序时出现“分段错误(核心转储)”