运行 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->data
是否包含Pixels.size()
的数据?你应该断言这一点。
根据我在有符号整数上使用~
的经验会导致麻烦。你想用~31
做什么?
【参考方案1】:
假设有width * height
像素,每个像素都有bits_per_pixel
位。然后 img->data 包含(width * height * bits_per_pixel) / CHAR_BIT
字节。
但是您正在尝试从img->data
中读取(大约)(width * height * height) / 8
,这是没有意义的。
将其更改为(width * height * bits_per_pixel) / CHAR_BIT
。
【讨论】:
以上是关于运行 C++ 代码时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章