C/C++ - Как скопировать участок памяти

Ответить
Аватара пользователя
___oj

C/C++ - Как скопировать участок памяти

Сообщение ___oj »

Как скопировать данные с некоторого участка памяти, занятого например массивом? По типу memcpy. Но дело в том что мемцпу работает со статической памятьтю. А если память выделена в куче, то как быть? В таком случае не работает ни sizeof, ни memcpy. Такое происходит, вероятно, потому - что этим функциям, в случае с динамическим массиврм, приходится передавать указатель, кот-ый содержит адрес по которому расположен массив, а не сам адрес. Может можно что-то придумать?

Просто в падлу копировать каждый раз, каждый элемент структуры отдельно. Это слишком скурпулезно.
Аватара пользователя
pva

Re: C/C++ - Как скопировать участок памяти

Сообщение pva »

Сейчас практически во всех доступных простому смертному системах память линейная и однородная. С точки зрения копирования разницы между статической и динамической памятью нет. Компилятор автоматически перетранслирует имя массива и указатель в адрес, в этом смысле код



Код:

Код: Выделить всё

char mem1[10];
char mem2[20];
memcpy(mem1, mem2, 10);
// делает то же что
char* mem3 = mem1;
memcpy(mem1, mem3, 10);
// точно так же (тем же способом) как
char* mem4 = new char(10);
char* mem5 = new char(20);
memcpy(mem4, mem5, 10);

теперь что касается скурпулёзности



Код:

Код: Выделить всё

std::string mem1[10];
mem1[0] = "str1";
std::string mem2[20];
memcpy(mem1, mem2, sizeof(std::string)*10);
// строка состоит из указателя на память и дополнительных данных.
// При копировании мы сдублировали указатель, но не привели в соотвествие другие данные,
// например счётчик ссылок. Поэтому при удалении mem1 или mem2 мы рушим динамическую память
std::copy(&mem1[0], &mem1[10], &mem2[0]);
// теперь используется std::string::operator=(const std::string&), который всё приведёт в соответсвие
// при таком споосбе память останется невредимой
// чтобы не копировать каждый отдельно:
struct st1
{
  std::string s1;
  std::vector v1;
  int s2;
  AnsiString as1;
};
st1 mem1, mem2;
// "муторно" копируем
mem1 = mem2;
Аватара пользователя
___oj

Re: C/C++ - Как скопировать участок памяти

Сообщение ___oj »

Цитата pva:



Сейчас практически во всех доступных простому смертному системах память линейная и однородная
C/C++ - Как скопировать участок памяти




Что-то не верится мне что так гладко дела обстоят




Цитата pva:



// точно так же (тем же способом) как

char* mem4 = new char(10);

char* mem5 = new char(20);

memcpy(mem4, mem5, 10);
C/C++ - Как скопировать участок памяти




Компилятор Borland-а BCC32 выдает ошибку выделения памяти. Разве я задавал бы этот вопрос, еслиб все было так просто ?



Так-же попробуй передать в какую-либо функцию любой массив и там определи его размер с помощью sizeof-а. Получешь размер типа этого массива.


Цитата pva:



st1 mem1, mem2;

// "муторно" копируем

mem1 = mem2;
C/C++ - Как скопировать участок памяти




Пример Не муторного копирования привел, а перегрузку рператора = , кот-ая бесебя берет на себя всю муторность, нет. Хотя конечно перегрузка помогает в данном случае.





.
Аватара пользователя
pva

Re: C/C++ - Как скопировать участок памяти

Сообщение pva »

Цитата ___oj:



Что-то не верится мне что так гладко дела обстоят
C/C++ - Как скопировать участок памяти




В windows начиная с версии 4.0 для приложений точно. В линуксе, начиная с самых первых для PC тоже всё линейно.
Цитата ___oj:



Компилятор Borland-а BCC32 выдает ошибку выделения памяти. Разве я задавал бы этот вопрос, еслиб все было так просто ?
C/C++ - Как скопировать участок памяти




можно код?
Цитата ___oj:



Так-же попробуй передать в какую-либо функцию любой массив и там определи его размер с помощью sizeof-а. Получешь размер типа этого массива.
C/C++ - Как скопировать участок памяти




обрисуй полностью задачу, а то я не догоняю, что сделать хочешь
Ответить

Вернуться в «Программирование и базы данных»