Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Как скопировать участок памяти

Ответить
Настройки темы
C/C++ - Как скопировать участок памяти

Новый участник


Сообщения: 49
Благодарности: 17

Профиль | Отправить PM | Цитировать


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

Отправлено: 09:53, 15-11-2008

 
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Сейчас практически во всех доступных простому смертному системах память линейная и однородная. С точки зрения копирования разницы между статической и динамической памятью нет. Компилятор автоматически перетранслирует имя массива и указатель в адрес, в этом смысле код
Код: Выделить весь код
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;
Это сообщение посчитали полезным следующие участники:

Отправлено: 12:57, 16-11-2008 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 49
Благодарности: 17

Профиль | Отправить PM | Цитировать


Цитата 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; »
Пример Не муторного копирования привел, а перегрузку рператора = , кот-ая бесебя берет на себя всю муторность, нет. Хотя конечно перегрузка помогает в данном случае.


.

Отправлено: 14:31, 16-11-2008 | #3

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Цитата ___oj:
Что-то не верится мне что так гладко дела обстоят »
В windows начиная с версии 4.0 для приложений точно. В линуксе, начиная с самых первых для PC тоже всё линейно.
Цитата ___oj:
Компилятор Borland-а BCC32 выдает ошибку выделения памяти. Разве я задавал бы этот вопрос, еслиб все было так просто ? »
можно код?
Цитата ___oj:
Так-же попробуй передать в какую-либо функцию любой массив и там определи его размер с помощью sizeof-а. Получешь размер типа этого массива. »
обрисуй полностью задачу, а то я не догоняю, что сделать хочешь

Отправлено: 19:05, 16-11-2008 | #4



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Как скопировать участок памяти

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Как полностью скопировать юзера ? mitiya Microsoft Windows NT/2000/2003 3 14-10-2008 10:13
Как скопировать нефинализированный DVD? ЮЮА Видео и аудио: обработка и кодирование 15 05-04-2008 22:31
Как правильно скопировать профиль? Ferum01 Microsoft Windows NT/2000/2003 7 07-09-2007 10:17
Как скопировать входящих пользователей диалапа Shaytan Microsoft Windows 2000/XP 0 30-03-2007 10:45
как скопировать сайт? Millenium Вебмастеру 12 25-06-2005 20:36




 
Переход