相关疑难解决方法(0)

数组placement-new需要缓冲区中未指定的开销?

[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 …

c++ standards memory-management placement-new

62
推荐指数
4
解决办法
5787
查看次数

free()分配的新内存是否安全?

我正在研究一个C++库,其中一个函数返回一个(新分配的)指向一个双精度数组的指针.API声明调用者有责任释放内存.

但是,C++库曾经在C中实现,并且有问题的函数会分配内存malloc().它还假定调用者将释放该内存free().

我可以通过电话安全地替换malloc()呼叫new吗?现有的客户端代码(free()如果我这样做会使用中断吗?到目前为止我能找到的是官方文档free(),其中说明了这一点

如果ptr没有指向使用[malloc,calloc或realloc]分配的内存块,则会导致未定义的行为.

但我相信这是在C++与自己的分配运算符一起出现之前编写的.

c++ memory-management

6
推荐指数
2
解决办法
2987
查看次数

标签 统计

c++ ×2

memory-management ×2

placement-new ×1

standards ×1