【发布时间】:2012-04-06 15:30:48
【问题描述】:
假设我要分配一个整数数组。
int* array = new int[5];
然后假设我有 5 个 int 指针,都指向数组的 5 个不同整数。
int* v1 = &array[0];
int* v2 = &array[1]; //etc..etc
现在我已经“记住”了数组中所有整数的位置,我想将元素作为单独的整数进行管理。所以理论上如果我将我的数组指针设置为 NULL...
array = NULL;
理论上我不必担心,因为我所有的 v1 和 v2 指针都指向数组中的所有元素。那么问题就是说我已经完成了v2。所以我想删除 v2 以释放这 4 个字节。
delete v2;
不幸的是,当我尝试这样做时,会发生不好的事情。我假设是因为内存分配表说“嘿,你不能在那个空间中删除,因为它当前属于 int 数组的一部分!”
那好吧,那我想说
delete [] array;
但如果我这样做,我想确保当我这样做时......
int* v1 = new int;
我想保证新分配的整数是在array[0]的地址创建的。那么有没有办法指定新值的创建位置?或者我可以以某种方式控制内存列表?
我尝试通过调用类似...的方式来使用放置运算符...
int* v1 = new((void*)&array[0]) int;
但是当我使用删除运算符删除数组然后尝试通过取消引用它来访问 v1 时......说
cout<<*v1;
我在屏幕上看到一堆文字,上面写着“双重释放或损坏(fasttop):...
我在代码块中使用 Ubuntu 11.04 和 g++ 编译器。
另外,仅供参考,我查看了Create new C++ object at specific memory address?,这是我获得有关放置操作员信息的地方,但它似乎没有按我需要的方式工作。
#include <iostream>
using namespace std;
int main()
{
int *array = new int[20];
for(int i=0;i<4;i++)
{
array[i] = i;
}
int* a = new ((void*)&array[0]) int;
int* b = new ((void*)&array[1]) int;
int* c = new ((void*)&array[2]) int;
int* d = new ((void*)&array[3]) int;
int* e = new ((void*)&array[4]) int;
cout<<*a<<endl;
cout.flush();
delete[] array;
cout<<*a;
delete a;
delete b;
delete c;
delete d;
delete e;
return 0;
}
【问题讨论】:
-
哦,顺便说一句,我在 cout 上没有收到“双重释放或损坏”消息,当我尝试删除 a 时才收到。
-
听起来你真的很想创建一个内存池,这样你就不需要删除数组中的变量,而是将其标记为无效,然后在需要新分配时重用它。
-
通过 int* v1 = array[0];你的意思是 int* v1 = &array[0]; 吗? int* v1 = 数组[0];当 array[0] 是 int 时有点荒谬。
-
您为什么要这样做?目的是什么?可能有办法做到这一点,但我看不出这样做会得到什么。
-
您能展示一下您是如何进行删除的,即实际的完整代码吗?