C++,调试断言失败

C++, Debug Assertion Failed

本文关键字:失败 断言 调试 C++      更新时间:2023-10-16

调试断言失败

花了很多时间试图弄清楚为什么我在这个代码中有一个断言。

如果类中没有字符串,则效果很好。

你能解释一下吗, 为什么我有一个包含字符串的类的断言。

谢谢的马克

#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;