- 主题:一个很奇怪的内存分配的问题,是不是因为我小白,没弄清一些东
不可避免的,我也是尝试造了一个string,我把它定义为mString
我先在对象里定义了一个b_str_
char* b_str_ = NULL;
初始化的时候,需要给这个指针分配一个初始空间的:我用了两个方法,大家看看有什么区别:
#ifdef UseMalloc
b_str_ = (char*)malloc(BaseLen);
#else
b_str_ = new char[BaseLen];
#endif // UseMalloc
其它的参数先忽略,不重要。
重新分配内存的时候:
#ifdef UseMalloc
char* newptr = (char*)realloc(b_str_, Len);
if (newptr)
{
if (newptr != b_str_)
{
b_str_ = newptr;
memLen = Len;
}
}
#else
char* newptr = new char[Len];
if (newptr)
{
if (newptr != b_str_)
{
memcpy(newptr, b_str_, len_);
delete[] b_str_;
b_str_ = newptr;
memLen = Len;
}
}
#endif // UseMalloc
析构的时候:
mString::~mString()
{
#ifdef UseMalloc
free(b_str_);
b_str_ = 0;
#else
delete[] b_str_;
b_str_ = NULL;
#endif // UseMalloc
}
各位大神们,看看上面的代码,两种方式有什么区别?
我现在遇到的问题是:如果我用UserMalloc的方式,就会有问题,线程在不确定的情况下就会崩!
而我用new char[...]的方式,就没什么问题
各位大神高手们,可以知道这其中有什么我这个小白没考虑到的问题吗?
--
FROM 223.198.171.*
刚把贴子发出来后,我再仔细看了我的代码,好像是有点问题,因为realloc的时候,没有free(b_str_)
....
不知道会不会跟这个有关?我得要先试一下,看看会不会崩,才知道是不是这个问题。
【 在 njer 的大作中提到: 】
: 不可避免的,我也是尝试造了一个string,我把它定义为mString
: 我先在对象里定义了一个b_str_
: char* b_str_ = NULL;
: ...................
--
FROM 223.198.171.*
事实证明,我加了free(b_str_)过后,更不行。
char* newptr = (char*)realloc(b_str_, Len);
if (newptr)
{
if (newptr != b_str_)
{
free(b_str_); //加了这一行,结果这一行就直接让程序崩了! 。。。 这什么道理啊?
b_str_ = newptr;
memLen = Len;
}
}
--
FROM 223.198.171.*
对了,我记起来了我之前为什么不加free,是因为realloc好像是自带了free...所以不需要加。。。
但关键是我不加,它也是会在不确定的情况下就会崩掉。
【 在 njer 的大作中提到: 】
: 事实证明,我加了free(b_str_)过后,更不行。
: char* newptr = (char*)realloc(b_str_, Len);
: if (newptr)
: ...................
--
FROM 223.198.171.*
另:程序DEBUG的时候,它崩的位置,并不是在mString里,而是各个不同的地方,各种甚至跟mString的变量没有关系的地方也会崩!
所以,上面的代码中的两种分配内存的方式,有什么区别呢?
--
FROM 223.198.171.*
自己终于找到答案了:应该是没问题,我自己写漏了语句了:
#ifdef UseMalloc
char* newptr = (char*)realloc(b_str_, Len);
if (newptr)
{
if (newptr != b_str_)
{
b_str_ = newptr;
memLen = Len;
}
else //这里还得要加上else
memLen = Len; //重新记录已分配的长度,加上后就不崩了!折腾了我好长时间,以为我之前说的C++很简单的说法是错的了
}
【 在 njer 的大作中提到: 】
: 不可避免的,我也是尝试造了一个string,我把它定义为mString
: 我先在对象里定义了一个b_str_
: char* b_str_ = NULL;
: ...................
--
FROM 223.198.171.*
realloc这个函数, 我写了二十年代码也没用过
【 在 njer 的大作中提到: 】
: 自己终于找到答案了:应该是没问题,我自己写漏了语句了:
: #ifdef UseMalloc
: char* newptr = (char*)realloc(b_str_, Len);
: ...................
--
FROM 221.219.211.*
realloc是C的,不是C++的,少用
而且这个函数有些情况下是UB,要仔细读文档
而且你这个变量命名,这么短的代码里,把各种风格全都用上了,哈哈
--
修改:z16166 FROM 61.48.130.*
FROM 61.48.130.*
虽然没有你的业务逻辑,但是new为啥没有问题,它也没有设置memlen吧。
【 在 njer 的大作中提到: 】
: 自己终于找到答案了:应该是没问题,我自己写漏了语句了:
: #ifdef UseMalloc
: char* newptr = (char*)realloc(b_str_, Len);
: ...................
--来自微微水木3.5.14
--
FROM 222.64.106.*
这个就是最终导致我没反应过来的地方。
因为new方式下不会出现newptr == b_str_的情况,所以没有else下面的也没关系。
而realloc下的是会有这种情况出现的,当时我写的时候脑袋也是有这个概念的,后来就忘了,然后再写了new char方式后,眼睛就总在两处做对比,总觉得没什么问题,但死活就是不行,脑袋就一直没反应过来realloc下是会有newptr == b_str_的情况出现的。。
【 在 foliver 的大作中提到: 】
: 虽然没有你的业务逻辑,但是new为啥没有问题,它也没有设置memlen吧。
--
FROM 223.198.171.*