Показать полную графическую версию : Как скопировать участок памяти
Как скопировать данные с некоторого участка памяти, занятого например массивом? По типу memcpy. Но дело в том что мемцпу работает со статической памятьтю. А если память выделена в куче, то как быть? В таком случае не работает ни sizeof, ни memcpy. Такое происходит, вероятно, потому - что этим функциям, в случае с динамическим массиврм, приходится передавать указатель, кот-ый содержит адрес по которому расположен массив, а не сам адрес. Может можно что-то придумать?
Просто в падлу копировать каждый раз, каждый элемент структуры отдельно. Это слишком скурпулезно.
Сейчас практически во всех доступных простому смертному системах память линейная и однородная. С точки зрения копирования разницы между статической и динамической памятью нет. Компилятор автоматически перетранслирует имя массива и указатель в адрес, в этом смысле код
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;
Сейчас практически во всех доступных простому смертному системах память линейная и однородная »
Что-то не верится мне что так гладко дела обстоят
// точно так же (тем же способом) как
char* mem4 = new char(10);
char* mem5 = new char(20);
memcpy(mem4, mem5, 10); »
Компилятор Borland-а BCC32 выдает ошибку выделения памяти. Разве я задавал бы этот вопрос, еслиб все было так просто ?
Так-же попробуй передать в какую-либо функцию любой массив и там определи его размер с помощью sizeof-а. Получешь размер типа этого массива.
st1 mem1, mem2;
// "муторно" копируем
mem1 = mem2; »
Пример Не муторного копирования привел, а перегрузку рператора = , кот-ая бесебя берет на себя всю муторность, нет. Хотя конечно перегрузка помогает в данном случае.
.
Что-то не верится мне что так гладко дела обстоят »
В windows начиная с версии 4.0 для приложений точно. В линуксе, начиная с самых первых для PC тоже всё линейно.Компилятор Borland-а BCC32 выдает ошибку выделения памяти. Разве я задавал бы этот вопрос, еслиб все было так просто ? »
можно код?Так-же попробуй передать в какую-либо функцию любой массив и там определи его размер с помощью sizeof-а. Получешь размер типа этого массива. »
обрисуй полностью задачу, а то я не догоняю, что сделать хочешь
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.