Скажите, что я хочу выделить массив целых чисел.
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;
Я хочу гарантировать, что вновь выделенное целое число было создано по адресу массива [0]. Так есть ли способ указать, где создается новое значение? Или можно как-то контролировать список памяти?
Я попытался использовать оператор размещения, вызвав что-то вроде ...
int* v1 = new((void*)&array[0]) int;
но потом, когда я удаляю массив с помощью оператора delete, а затем пытаюсь получить доступ к v1, разыменовав его ... скажем
cout<<*v1;
Я получаю на экран кучу текста с надписью «двойное освобождение или повреждение (fasttop): ...
Я использую Ubuntu 11.04 и компилятор g ++ в кодовых блоках.
Кроме того, только к вашему сведению, я смотрел на Создать новый объект C ++ по определенному адресу памяти? и именно здесь я получил информацию об операторе размещения, но, похоже, он работает не так, как я нужно, чтобы оно работало.
#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;
}