最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于C++中由于字節(jié)對齊引起內(nèi)存問題定位分析

 更新時間:2021年06月10日 09:54:45   作者:wingrez  
前幾天遇到一個稀奇古怪的問題,在創(chuàng)建對象的時候程序異常退出,查找代碼發(fā)現(xiàn)結(jié)構(gòu)體數(shù)組問題,最終把問題簡化得到解決方法,下面小編把我的問題及解決方案分享到腳本之家平臺供大家參考下

最近遇到了一個奇怪的問題,在創(chuàng)建對象時程序異常退出,具體地,在構(gòu)造函數(shù)中訪問類中最后一個成員變量時,程序異常退出。

問題定位

查看代碼,發(fā)現(xiàn)該類中有一個結(jié)構(gòu)體數(shù)組,該結(jié)構(gòu)體在類的外面聲明,用 #pragma pack(push,1) 設(shè)置了一字節(jié)對齊方式,而類不在這個作用范圍內(nèi),所以是按照默認字節(jié)對齊方式的。懷疑該問題是因為,類的字節(jié)對齊方式和類中的結(jié)構(gòu)體字節(jié)方式不同引起的。但這從理論方面解釋不通。

繼續(xù)定位,在創(chuàng)建對象之前用sizeof打印類的大小,再在類的構(gòu)造函數(shù)中打印類的大小。發(fā)現(xiàn)這兩個大小居然不同。這證實了的確與字節(jié)對齊有關(guān),創(chuàng)建對象之前和在構(gòu)造函數(shù)中,兩邊選擇的字節(jié)對齊方式不同,導(dǎo)致計算類的大小不同。

但是為什么這兩個地方的字節(jié)對齊方式不同呢?

當(dāng)把該類也使用 #pragma pack(push,1) 設(shè)置字節(jié)對齊方式之后,類的大小又變得相同了。大膽猜測,由于 #pragma pack(push, 1) 是一種棧的結(jié)構(gòu),可能有某個文件中,設(shè)置了字節(jié)對齊方式之后,沒有用 #pragma pack(pop) 恢復(fù)。

查找全局文件,的確找到了一個文件存在這樣的問題,當(dāng)把 #pragma pack(pop) 后加上后,問題解決。

問題模型

我將這個問題簡化成下面這樣,可以幫助大家更好地理解。
CA.h,CA類的聲明,模擬只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.h,CB類的聲明。St結(jié)構(gòu)體設(shè)置一字節(jié)對齊方式,CB類使用默認字節(jié)對齊方式。

#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.cpp,CB類的實現(xiàn)。

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

using namespace std;

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

main.cpp,用于創(chuàng)建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;
}

編譯上述文件并執(zhí)行,可以得到下面的結(jié)果:

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

可以看到,兩處計算的類的大小是不同的。在main函數(shù)里,分配了155字節(jié)的空間,而在構(gòu)造函數(shù)中卻認為有156字節(jié)的空間,當(dāng)訪問最后一字節(jié)時,程序出現(xiàn)了踩內(nèi)存。

問題分析

為什么main.cpp和CB.cpp認為CB的字節(jié)對齊方式不同呢?
這主要還是因為main.cpp包含了CA.h,CA.h在main.cpp中展開,CB.h也展開,CA.h中設(shè)置的一字節(jié)對齊方式,影響到了CB類的聲明,當(dāng)編譯main.cpp時,CB使用一字節(jié)對齊方式。

而CB.h沒有包含CA.h,當(dāng)編譯CB.cpp時,并沒有受到CA.h的影響,CB使用默認字節(jié)對齊方式。

以上就是關(guān)于C++中由于字節(jié)對齊引起內(nèi)存問題定位分析的詳細內(nèi)容,更多關(guān)于c++字節(jié)對齊內(nèi)存問題的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言各種符號的使用介紹上篇

    C語言各種符號的使用介紹上篇

    C 語言的基本符號就有 20 多個,每個符號可能同時具有多重含義,而且這些符號之間相互組合又使得 C 語言中的符號變得更加復(fù)雜起來
    2022-08-08
  • Qt的Qss用法小結(jié)

    Qt的Qss用法小結(jié)

    Qt的Qss是一種用于定義用戶界面的樣式表語言,本文主要介紹了Qt的Qss用法小結(jié),非常具有實用價值,需要的朋友可以參考下
    2023-06-06
  • C語言system 自動關(guān)機函數(shù)代碼

    C語言system 自動關(guān)機函數(shù)代碼

    這篇文章主要介紹了C語言system 自動關(guān)機函數(shù)代碼,需要的朋友可以參考下
    2016-04-04
  • C++中關(guān)于constexpr函數(shù)使用及說明

    C++中關(guān)于constexpr函數(shù)使用及說明

    這篇文章主要介紹了C++中關(guān)于constexpr函數(shù)使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 用C語言程序判斷大小端模式

    用C語言程序判斷大小端模式

    本文介紹了用C語言程序判斷大小端的方法,與大家分享一下。
    2013-04-04
  • Pipes實現(xiàn)LeetCode(194.轉(zhuǎn)置文件)

    Pipes實現(xiàn)LeetCode(194.轉(zhuǎn)置文件)

    這篇文章主要介紹了Pipes實現(xiàn)LeetCode(194.轉(zhuǎn)置文件),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語言實現(xiàn)簡單的圖書管理系統(tǒng)

    C語言實現(xiàn)簡單的圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • C++?Boost?Format超詳細講解

    C++?Boost?Format超詳細講解

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • MFC修改編輯框光標(biāo)顯示位置方法詳解

    MFC修改編輯框光標(biāo)顯示位置方法詳解

    這篇文章主要介紹了在MFC中利用CComboBox控件修改編輯框光標(biāo)顯示位置的兩種解決方法,文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-02-02
  • C 語言基礎(chǔ)教程(我的C之旅開始了)[四]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[四]

    C 語言基礎(chǔ)教程(我的C之旅開始了)[四]...
    2007-02-02

最新評論

云浮市| 崇礼县| 武川县| 宁波市| 札达县| 松桃| 大姚县| 南皮县| 滦南县| 贡山| 民乐县| 泰安市| 丽江市| 惠州市| 西丰县| 沙洋县| 深水埗区| 岳普湖县| 宣武区| 海口市| 依安县| 宝清县| 西青区| 山丹县| 灌阳县| 通山县| 大冶市| 内江市| 长汀县| 绥滨县| 仲巴县| 合川市| 永城市| 德兴市| 高密市| 东阳市| 石柱| 舟曲县| 当雄县| 甘孜| 漠河县|