纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

c++字节对齐内存问题 关于C++中由于字节对齐引起内存问题定位分析

wingrez   2021-06-10 我要评论
想了解关于C++中由于字节对齐引起内存问题定位分析的相关内容吗wingrez在本文为您仔细讲解c++字节对齐内存问题的相关知识和一些Code实例欢迎阅读和指正我们先划重点:c++字节对齐内存问题,c++字节对齐下面大家一起来学习吧。

最近遇到了一个奇怪的问题在创建对象时程序异常退出具体地在构造函数中访问类中最后一个成员变量时程序异常退出。

问题定位

查看代码发现该类中有一个结构体数组该结构体在类的外面声明用 #pragma pack(push,1) 设置了一字节对齐方式而类不在这个作用范围内所以是按照默认字节对齐方式的。怀疑该问题是因为类的字节对齐方式和类中的结构体字节方式不同引起的。但这从理论方面解释不通。

继续定位在创建对象之前用sizeof打印类的大小再在类的构造函数中打印类的大小。发现这两个大小居然不同。这证实了的确与字节对齐有关创建对象之前和在构造函数中两边选择的字节对齐方式不同导致计算类的大小不同。

但是为什么这两个地方的字节对齐方式不同呢?

当把该类也使用 #pragma pack(push,1) 设置字节对齐方式之后类的大小又变得相同了。大胆猜测由于 #pragma pack(push, 1) 是一种栈的结构可能有某个文件中设置了字节对齐方式之后没有用 #pragma pack(pop) 恢复。

查找全局文件的确找到了一个文件存在这样的问题当把 #pragma pack(pop) 后加上后问题解决。

问题模型

我将这个问题简化成下面这样可以帮助大家更好地理解。
CA.hCA类的声明模拟只push没pop的文件

#ifndef CA_H
#define CA_H

#include <iostream>
using namespace std;

#pragma pack(push, 1)

class CA {
    int a;
    char b;
};

#endif

CB.hCB类的声明。St结构体设置一字节对齐方式CB类使用默认字节对齐方式。

#ifndef CB_H
#define CB_H

#include <iostream>
using namespace std;

#pragma pack(push,1)

struct St {
    int a1;
    int a2;
    int a3;
    char a4;
    char a5;
};

#pragma pack(pop)

class CB {
public:
    CB();
    int a1;
    int a2;
    int a3;
    char a4;
    char a5;
    St a6[10];
    bool a7;
};

#endif

CB.cppCB类的实现。

#include "CB.h"
#include <iostream>

using namespace std;

CB::CB()
{
    cout << "constructor: sizeof(CB) = ";
    cout << sizeof(CB) << endl;
}

main.cpp用于创建CB对象

#include "CA.h"
#include "CB.h"
#include <iostream>

using namespace std;

int main()
{
    cout << "main: sizeof(CB) = ";
    cout << sizeof(CB) << endl;
    CB *pCB = new CB;
}

编译上述文件并执行可以得到下面的结果:

main: sizeof(CB) = 155
constructor: sizeof(CB) = 156

可以看到两处计算的类的大小是不同的。在main函数里分配了155字节的空间而在构造函数中却认为有156字节的空间当访问最后一字节时程序出现了踩内存。

问题分析

为什么main.cpp和CB.cpp认为CB的字节对齐方式不同呢?
这主要还是因为main.cpp包含了CA.hCA.h在main.cpp中展开CB.h也展开CA.h中设置的一字节对齐方式影响到了CB类的声明当编译main.cpp时CB使用一字节对齐方式。

而CB.h没有包含CA.h当编译CB.cpp时并没有受到CA.h的影响CB使用默认字节对齐方式。


相关文章

猜您喜欢

网友评论

Copyright 2020 www.Shellfishsoft.com 【贝软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式