【发布时间】:2015-08-10 03:40:37
【问题描述】:
这可能是重复的,但我在任何地方都找不到解决方案。
我有这样的源代码:
struct Blob{
//...
static void *operator new(size_t size_reported, size_t size) {
return ::operator new(size);
}
};
我是这样使用的:
std::shared_ptr<Blob> blob;
// ...
size_t size = calcSize(); // it returns say 231
Blob *p = new(size) Blob();
blob.reset(p);
我能否以某种方式更改代码,以便我可以使用std::make_shared 或std::allocate_shared,所以我有single allocation 而不是two allocations?
更新
我能够消除 new 并将代码简化为以下内容:
struct Blob{
//...
};
std::shared_ptr<Blob> blob;
// ...
size_t size = calcSize(); // it returns say 231
// allocate memory
void *addr = ::operator new(size);
// placement new
Blob *p = ::new(addr) Blob();
blob.reset(p);
它做的事情完全一样,但我认为现在更清楚我要做什么了。
【问题讨论】:
-
是的,把它改成
std::shared_ptr<Blob> blob = std::make_shared<Blob>();,你会得到一个单一的分配。 -
但这是“自定义”(重载)新运算符?
Blob *p = new(size) Blob(); -
你的重载运算符只用于
new Blob,不能用于其他任何地方。重载operator new通常是一个非常无用的功能,因为它没有与标准库的任何部分集成。我什至可以将其称为语言的错误特征,甚至提供此功能。看来我们现在已经了解到自定义内存分配的方法是通过库(即通过分配器)。 -
那么,这是否意味着如果 Nick 想要确保使用重载的 new 时,应该在此处编写和使用自定义分配器?
-
@AaronMcDaid:不,这意味着任何人都不应该重载
operator new,如果您想要自定义分配语义,请编写自定义分配器并将其用于所有内容。
标签: c++ c++11 new-operator shared-ptr