Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Как скопировать участок памяти (http://forum.oszone.net/showthread.php?t=122985)

___oj 15-11-2008 09:53 953231

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

pva 16-11-2008 12:57 953967

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

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<int> v1;
  int s2;
  AnsiString as1;
};

st1 mem1, mem2;
// "муторно" копируем
mem1 = mem2;


___oj 16-11-2008 14:31 954031

Цитата:

Цитата pva
Сейчас практически во всех доступных простому смертному системах память линейная и однородная »

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

Цитата:

Цитата pva
// точно так же (тем же способом) как
char* mem4 = new char(10);
char* mem5 = new char(20);
memcpy(mem4, mem5, 10); »

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

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

Цитата pva
st1 mem1, mem2;
// "муторно" копируем
mem1 = mem2; »

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


.

pva 16-11-2008 19:05 954272

Цитата:

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

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

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

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

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

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


Время: 14:47.

Время: 14:47.
© OSzone.net 2001-