【发布时间】:2012-11-28 23:18:53
【问题描述】:
假设我想调整一个 int 指针数组的大小,我有一个看起来像这样的函数
template<typename T>
static void Resize(T* arr, UINT oldsize, UINT newsize) {
T* ret = new T [newsize];
memcpy(ret, arr, sizeof(arr[0]) * oldsize);
delete[] arr;
arr = ret;
};
问题开始于我尝试调整使用“new”关键字创建的元素数组的大小(即使类内的数据本身是 POD),因为 delete[] 触发了它们的解构函数,然后离开新数组带有指向不再存在的对象的指针。所以..即使对象是用“new”创建的,我不能只使用 free 命令来摆脱旧数组吗?还是以某种方式删除数组而不触发每个成员的解构器?
【问题讨论】:
-
如果
arr被声明为T*& arr,这将正常工作(假设T是可简单复制的并且具有noexcept默认构造函数)。 -
如果您要编写这样的潜在危险代码,那么只需使用
malloc和free。由于memcpy,您的代码无法处理非平凡类型,因此使用new和delete没有多大意义。 -
@Pubby:或者我们可以建议
std::copy,以便正确完成,而不是更不正确。 -
the delete[] triggers their deconstructor which then leaves the new array with pointers to objects that dont exist anymore- 否;delete[]破坏了原始指针,而不是它们指向的ints。 -
我切换到向量,比我想象的要容易。还得删掉我 3/4 的代码,因为显然大部分代码都花在了管理数组上 T_T
标签: c++