不要问我我想要做什么,这只是一个快速测试,它的唯一目的是看看新的放置是否有问题.
我发现了一个问题,或者我只是误解了一些问题.
#include <vector>
using namespace std;
#define WORKS
int main(int argc, char** argv) {
vector<int>* pp = (vector<int>*)malloc(sizeof(vector<int>)*20);
#ifdef WORKS
for(int i = 0; i < 20; ++i)
new (pp+i) vector<int>;
#else
new (pp) vector<int>[20];
#endif
for(int i = 0; i < 20; ++i)
pp[i].~vector<int>();
}
Run Code Online (Sandbox Code Playgroud)
当你删除"#define WORKS"时,它会给你访问冲突,比如
for(int i = 0; i < 20; ++i)
new (pp+i) vector<int>;
Run Code Online (Sandbox Code Playgroud)
哪作得好,不同于
new (pp) vector<int>[20];
Run Code Online (Sandbox Code Playgroud)
这是在破坏阶段抛出异常的原因.这里发生了什么?我正在使用Windows XP并使用VC++ Express 2010构建.
Jer*_*fin 10
§5.3.4/ 12:
-
new T[5]导致打电话operator new[](sizeof(T)*5+x)[...]
这里,x和y是非负的未指定值,表示数组分配开销; new-expression的结果将由operator new []返回的值抵消.这种开销可以应用于所有数组新表达式,包括那些引用库函数operator new [](std :: size_t,void*)和其他放置分配函数的表达式.开销的数量可能因新的一次调用而异.[强调补充]
总而言之,尝试放置数组可能需要一些未分配的未指定数量的开销.只要您单独放置元素,就不允许这样的开销,因此新的放置工作.
| 归档时间: |
|
| 查看次数: |
252 次 |
| 最近记录: |