C++ 为什么根据标题的包含顺序会出现分段错误?
我有以下文件,它是一个较大(但仍然很小)程序的一部分。程序编译时不考虑头的包含顺序,但如果在本地文件之后包含C++ 为什么根据标题的包含顺序会出现分段错误?,c++,C++,我有以下文件,它是一个较大(但仍然很小)程序的一部分。程序编译时不考虑头的包含顺序,但如果在本地文件之后包含,则会出现seg错误;如果在本地头文件之前包含它,程序运行正常 #include <fstream> #include "Bitmap.h" #include "BitmapInfoHeader.h" #include "BitmapFileHeader.h" namespace bmap { Bitmap::Bitmap(int width, int height) :
,则会出现seg错误;如果在本地头文件之前包含它,程序运行正常
#include <fstream>
#include "Bitmap.h"
#include "BitmapInfoHeader.h"
#include "BitmapFileHeader.h"
namespace bmap
{
Bitmap::Bitmap(int width, int height) : _width(width), _height(height), _pixels(new uint8_t[width * height * 3]{}) { }
void Bitmap::set_pixel(int x, int y, uint8_t red, uint8_t blue, uint8_t green) { }
bool Bitmap::write(string filename)
{
BitmapFileHeader file_header;
BitmapInfoHeader info_header;
file_header.file_size = sizeof(BitmapInfoHeader) + sizeof(BitmapFileHeader) + _width * _height * 3;
file_header.data_offset = sizeof(BitmapInfoHeader) + sizeof(BitmapFileHeader);
info_header.width = _width;
info_header.height = _height;
std::ofstream outfile(filename, ios::out | ios::binary);
if(!outfile) { return false; }
outfile.write((char *)(&file_header), sizeof(file_header));
outfile.write((char *)(&info_header), sizeof(info_header));
outfile.write((char *)(_pixels.get()), _width * _height * 3);
outfile.close();
return true;
}
Bitmap::~Bitmap() { }
}
这是C++,不是最可能的C++行为。通常,这是代码中未定义行为的标志。您忘记将打包设置为默认值:<代码> RustyX > PrimaPACK()/Cuth>谢谢大家,尤其是@我不知道我必须将打包打包回默认值。很可能是未定义的行为。通常这是代码中未定义行为的标志。您忘记将打包设置回默认值:
#pragma pack()
感谢大家,尤其是@RustyX,我不知道我必须将打包设置回默认值。
#ifndef BITMAP_H_
#define BITMAP_H_
#include <cstdint>
#include <string>
using namespace std;
namespace bmap{
class Bitmap
{
private:
int _width{0};
int _height{0};
unique_ptr<uint8_t[]> _pixels{nullptr};
public:
Bitmap(int width, int height);
bool write(string filename);
void set_pixel(int x, int y, uint8_t red, uint8_t blue, uint8_t green);
virtual ~Bitmap();
};
}
#endif
#ifndef BITMAPFILEHEADER_H_
#define BITMAPFILEHEADER_H_
#include <cstdint>
namespace bmap
{
#pragma pack(2)
struct BitmapFileHeader
{
char header[2]{ 'B', 'M' };
int32_t file_size;
int32_t reserved{0};
int32_t data_offset;
};
}
#endif
#ifndef BITMAPINFOHEADER_H_
#define BITMAPINFOHEADER_H_
#include <cstdint>
namespace bmap
{
#pragma pack(2)
struct BitmapInfoHeader
{
int32_t header_size{40};
int32_t width;
int32_t height;
int16_t planes{1};
int16_t bits_per_pixel{24};
int32_t compression{0};
int32_t data_size{0};
int32_t horizontal_resolution{2400};
int32_t vertical_resolution{2400};
int32_t colors{0};
int32_t important_colors{0};
};
}
#endif
Program received signal SIGSEGV, Segmentation fault.
0x00007fff994bdf24 in std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush() () from /usr/lib/libc++.1.dylib
(gdb) where
#0 0x00007fff994bdf24 in std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush() () from /usr/lib/libc++.1.dylib
#1 0x00007fff994c299e in std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) () from /usr/lib/libc++.1.dylib
#2 0x00007fff994c41a6 in std::__1::basic_ostream<char, std::__1::char_traits<char> >::write(char const*, long) () from /usr/lib/libc++.1.dylib
#3 0x0000000100001626 in bmap::Bitmap::write (this=0x7fff5fbffa50, filename=...) at Bitmap.cpp:26
#4 0x0000000100004d48 in main () at Mandelbrot.cpp:11
(gdb)