2015-07-24 1 views
0

я, вероятно, нужно будет сделать что-то подобное тому, что StD :: вектор делает:шаг C++ объект в ячейку памяти

T *mem = malloc(...); // notice this is just memory allocation. 
T t; 
move... t to mem 
mem->doSomething(); 

Как я могу двигаться t над выделенной памяти?

Как перенести объект из выделенной памяти на новую переменную.

Как удалить объект из выделенной памяти - вызвать d-tor вручную?

Должен ли я использовать новые операторы размещения и назначения?

+1

Почему именно вы хотите сделать это? – Nidhoegger

+0

да что вы на самом деле пытаетесь сделать .... – AngryDuck

+0

рефакторинг чего-то из C. Это нечто очень похожее на std :: vector. В настоящее время есть указатели на объекты, но я хочу «поместить» объекты внутри «массива». Предположим, вам нужно вставить середину, на данный момент я помещаю много указателей и вставляю новый указатель в «отверстие». – Nick

ответ

1

Как это, но если вы не знаете, что вы делаете, то я бы избежать этого:

#include <new> 
#include <stdlib.h> 

void* mem = malloc(sizeof(T)); 
T t; 
T* tt = new(mem) T(std::move(t)); 
tt->doSomething(); 
tt->~T(); 
free(mem); 

Вы не можете буквально «движение» t к этой памяти, t всегда будет где он был создан, но вы можете создать другой объект в этом месте в виде копии t (используя конструктор перемещения, чтобы сделать копию, если она есть, но которая все еще оставляет t там, где она была и остается).

+0

Все еще существует, но возможно пуст. – nwp

+0

Отлично, вы можете просто включить код, как переместить tt по t, например. память над нормальной переменной. – Nick

+0

@Nick, 't = tt'. если вы имеете в виду что-то еще, вам придется объяснить, что вы имеете в виду. Я понятия не имею, что означает «перемещать память по переменной». –

1

Вы не можете перемещать живой объект, но вы можете переместить его из другого.

int main() { 
    std::string str = "Hello World !"; 

    // Allocate some storage 
    void *storage = std::malloc(sizeof str); 

    std::cout << str << '\n'; 

    // Move-contruct the new string inside the storage 
    std::string *str2 = new (storage) std::string(std::move(str)); 

    std::cout << str << '|' << *str2 << '\n'; 

    // Destruct the string and free the memory 
    str2->~basic_string(); 
    free(storage); 
} 

Выход:

Hello World ! 
|Hello World ! 
Смежные вопросы