new和delete导致的内存分配问题详解

new和delete导致的内存分配问题详解,第1张

new和delete导致的内存分配问题详解,第2张

在嵌入式系统中使用C++的一个常见问题是内存分配,即不受new和delete运算符的控制。

具有讽刺意味的是,问题的根源是C++非常容易和安全地管理内存。具体来说,当一个对象被消除时,它的析构函数可以安全地释放分配的内存。这当然是好事,但是使用的简单性使得程序员过度使用new和delete,而没有注意到嵌入式C++环境中的因果关系。而且在嵌入式系统中,由于内存的限制,频繁的动态分配大小可变的内存会造成很大的问题和堆破损的风险。

作为建议,保守地使用内存分配是嵌入式环境中的首要原则。

但是当你必须使用new和delete时,你必须控制C++中的内存分配。你需要用一个全局的new和delete替换系统的内存分配器,并且一个类一个类的重载new和delete。

防止堆碎片的一种常见方法是从不同的固定大小的内存容器中分配不同类型的对象。为每个类重载new和delete提供了这样的控制。

重载的全局新建和删除运算符

您可以轻松地重载new和delete运算符,如下所示:

void * operator new(size _ t size)
{
void * p = malloc(size);
return(p);
}
void运算符delete(void * p);
{
free(p);
}

这段代码可以替换默认的操作符来满足内存分配请求。出于解释C++的目的,我们也可以直接调用malloc()和free()。

您还可以重载单个类的new和delete运算符。这允许您灵活地控制对象的内存分配。

class test class {
public:
void * operator new(size _ t size);
void运算符delete(void * p);
//..这里的其他成员...
};

void * test class::operator new(size _ t size)
{
void * p = malloc(size);//用替代分配器
return (p)替换它;
}
void test class::operator delete(void * p)
{
free(p);//用替代的取消分配器替换它
}

这段代码用于所有TestClass对象的内存分配。此外,从TestClass继承的任何类也采用此方法,除非它重载new和delete操作符本身。通过重载new和delete操作符,可以自由地采用不同的分配策略,从不同的内存池中分配不同的类对象。

为单个类重载new[]和delete[]必须小心对象数组的分配。您可能希望调用已经重载的new和delete操作符,但事实并非如此。的内存请求被定向到全局new[]和delete[]运算符,这些内存来自系统堆。

C++将对象数组的内存分配作为一个单独的操作来处理,这与单个对象的内存分配是不同的。要改变这种方式,还需要重载new[]和delete[]操作符。

class test class {
public:
void * operator new[](size _ t size);
void运算符delete[](void * p);
//..这里的其他成员..
};
void * test class::operator new[](size _ t size)
{
void * p = malloc(size);
return(p);
}
void test class::operator delete[](void * p)
{
free(p);
}
int main(void)
{
test class * p = new test class[10];

// ...等等...

删除[]p;
}

但是,请注意:对于大多数C++实现,new[]操作符中的number参数是数组的大小加上附加存储对象数量的一些字节。这是内存分配机制中需要考虑的一个重要问题。您应该尽量避免分配对象数组,从而简化您的内存分配策略。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » new和delete导致的内存分配问题详解

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情