簡體   English   中英

C ++,調試斷言失敗

[英]C++, Debug Assertion Failed

調試斷言失敗

我花了很多時間試圖弄清楚為什么我在這段代碼中有一個斷言。

如果類中沒有字符串,則效果很好。

你能解釋一下,為什么我有一個斷言的類包含字符串。

謝謝馬克

#include <malloc.h>
#include <string>

class CTheClassWith_string
{
private:
    std::string TheName_;
};

class CTheClassWith_int
{
private:
    int TheName_;
};

int main()
{
std::string theString;
int size;

CTheClassWith_int   TheClassWith_int;
CTheClassWith_string TheClassWith_string;

CTheClassWith_int* pTheClassWith_int = new CTheClassWith_int;
size = _msize(pTheClassWith_int);
delete pTheClassWith_int;

CTheClassWith_string* pTheClassWith_string = new CTheClassWith_string;
size = _msize(pTheClassWith_string);
delete pTheClassWith_string;

CTheClassWith_int* pArrayTheClassWith_int = new CTheClassWith_int[2];
size = _msize(pArrayTheClassWith_int);
delete [] pArrayTheClassWith_int;

CTheClassWith_string* pArrayTheClassWith_string = new CTheClassWith_string[2];
size = _msize(pArrayTheClassWith_string);             // Why I assert on this line
delete [] pArrayTheClassWith_string;

return 0;
}

根據您的問題,我知道您想確定使用new()new[]()時從堆分配的字節大小。

好吧,您不能使用_msize()函數來實現此目的。 除了它是一個遺留函數外,用new獲得的指針不一定來自malloc()系列的底層調用( _msize()依次依賴於該斷言,因此是斷言)。

要確定從堆(或其他地方)分配的大小,您始終可以依賴sizeof()運算符:

CTheClassWith_int* pTheClassWith_int = new CTheClassWith_int;
size = sizeof(CTheClassWith_int);
delete pTheClassWith_int;

CTheClassWith_string* pTheClassWith_string = new CTheClassWith_string;
size = sizeof(CTheClassWith_string);
delete pTheClassWith_string;

CTheClassWith_int* pArrayTheClassWith_int = new CTheClassWith_int[2];
size = sizeof(CTheClassWith_int) * 2;
delete [] pArrayTheClassWith_int;

CTheClassWith_string* pArrayTheClassWith_string = new CTheClassWith_string[2];
size = sizeof(CTheClassWith_string) * 2;
delete [] pArrayTheClassWith_string;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM