gpt4 book ai didi

关于堆上成员变量的 C++ 礼节

转载 作者:可可西里 更新时间:2023-11-01 16:27:01 26 4
gpt4 key购买 nike

将对象成员明确地放在堆上(通过 new)是否被认为是不礼貌/不良做法?我认为您可能希望允许客户端选择内存区域来实例化对象。我知道在某些情况下堆成员可能是可以接受的。如果您知道某种情况,能否描述一下?

最佳答案

如果您有一个专为复制语义设计的类,并且您正在不必要地分配/取消分配一堆内存,我认为这是一种不好的做法。但总的来说,事实并非如此。有很多类可以使用堆存储。只要确保您没有内存泄漏(在析构函数、引用计数等中取消分配内容)就可以了。

如果您想要更大的灵 active ,请考虑让您的用户指定 Allocator .我会解释。

某些类别,例如std::vector、string、map 等需要它们所代表的数据结构的堆存储。这不被认为是不礼貌的行为;当您有一个自动分配的 vector 时,用户应该知道在调用 vector 构造函数时分配了一个缓冲区:

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*。每个 string 实例是否有一个通常取决于 STL 实现;通常它们被引用计数。

但是,对于几乎所有的 STL 类,用户确实可以选择放置东西的位置,因为他们可以指定一个分配器。 vector 的定义有点像这样:

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

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

vector<int, MyCustomAllocator> foo(10);

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

如果您担心在您的类(class)中使用堆进行某些存储可能是“不礼貌”,您可能需要考虑为您类(class)的用户提供这样的选项,以便他们可以指定事情的方式如果您的默认策略不符合他们的需求,他们就会被分配。

关于关于堆上成员变量的 C++ 礼节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/596093/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com