加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C关于堆上的成员变量的礼仪

发布时间:2020-12-16 03:12:54 所属栏目:百科 来源:网络整理
导读:明确地将对象成员放在堆上(通过新的),它被认为是不好的礼貌/坏习惯吗?我认为您可能希望允许客户端选择内存区域来实例化对象.我知道可能会有堆成员可以接受的情况.如果你知道情况可以描述一下吗? 解决方法 如果您有一个专为复制语义设计的课程,并且您不必要
明确地将对象成员放在堆上(通过新的),它被认为是不好的礼貌/坏习惯吗?我认为您可能希望允许客户端选择内存区域来实例化对象.我知道可能会有堆成员可以接受的情况.如果你知道情况可以描述一下吗?

解决方法

如果您有一个专为复制语义设计的课程,并且您不必要地分配/取消分配一堆内存,我可以看到这是不好的做法.一般来说,不是的.有很多类可以使用堆存储.只要确保你没有内存泄漏(取消分配在析构函数,引用计数等),你没事.

如果您想要更多的灵活性,请考虑让用户指定一个Allocator.我会解释一下.

某些类,例如std :: vector,string,map等需要堆存储用于它们所代表的数据结构.它不被认为是不礼貌的;当您有一个自动分配的向量时,预计用户将知道在向量构造函数被调用时分配一个缓冲区:

void foo() {
    // user of vector knows a buffer that can hold at least 10 ints
    // gets allocated here.
    std::vector<int> foo(10);  
}

同样,对于std :: string,你知道有一个内部的,堆分配的char *.每个字符串实例是否有一个通常取决于STL实现;经常被引用计数.

然而,对于几乎所有的STL类,用户可以选择放置什么东西,因为它们可以指定分配器.矢量定义如下:

template <typename T,typename Alloc = DefaultAllocator<T> >
class vector {
    // etc.
};

在内部,向量使用Alloc(默认为T的默认分配器)来分配可能需要的缓冲区和其他堆存储.如果用户不喜欢默认分配策略,则可以指定自己的策略:

vector<int,MyCustomAllocator> foo(10);

现在当构造函数分配时,它将使用MyCustomAllocator而不是默认值.这里有一些details on writing your own STL allocator.

如果您担心在类中使用堆进行某些存储可能是“不好的方式”,那么您可能需要考虑向类的用户提供这样的选项,以便它们可以指定如何分配事物您的默认策略不符合他们的需求.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读