为什么要一个会替换默认的操作new和delete使用自定义new和delete运营商?
这是继续重载新的和删除在非常有启发性的C++ FAQ:
运算符重载.
本FAQ的后续条目是:
我应该如何编写符合ISO C++标准的自定义new和delete运算符?
注意:答案基于Scott Meyers的"更有效的C++"课程.
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
c++ operator-overloading c++-faq new-operator delete-operator
[expr.new]C++的5.3.4 2月草案给出了一个例子:
new(2,f) T[5]导致打电话operator new[](sizeof(T)*5+y,2,f).这里,x和y是非负的未指定值,表示数组分配开销; new-expression的结果将从返回的值中抵消此数量
operator new[].这种开销可以应用于所有数组新表达式,包括那些引用库函数operator new[](std::size_t, void*)和其他放置分配函数的表达式.开销的数量可能因新的一次调用而异.- 末端的例子 ]
现在来看以下示例代码:
void* buffer = malloc(sizeof(std::string) * 10);
std::string* p = ::new (buffer) std::string[10];
Run Code Online (Sandbox Code Playgroud)
根据上面的引用,第二行将new (buffer) std::string[10]在内部调用operator new[](sizeof(std::string) * 10 + y, buffer)(在构造单个std::string对象之前).问题是如果y > 0,预分配的缓冲区太小了!
那么我如何知道在使用数组放置时预先分配多少内存?
void* buffer = malloc(sizeof(std::string) * 10 + how_much_additional_space);
std::string* p = ::new (buffer) std::string[10];
Run Code Online (Sandbox Code Playgroud)
或者标准某处是否保证y == 0在这种情况下?报价再次说:
这种开销可以应用于所有数组新表达式,包括那些引用库函数
operator …
我正在看新操作员的签名.这是:
void* operator new (std::size_t size) throw (std::bad_alloc);
Run Code Online (Sandbox Code Playgroud)
但是当我们使用这个运算符时,我们从不使用强制转换.即
int *arr = new int;
Run Code Online (Sandbox Code Playgroud)
那么,如何C++类型的指针转换void*到int*在这种情况下.因为,即使malloc返回a void*,我们也需要明确使用强制转换.
c++ memory-management new-operator dynamic-memory-allocation operator-keyword