Как скопировать данные с некоторого участка памяти, занятого например массивом? По типу memcpy. Но дело в том что мемцпу работает со статической памятьтю. А если память выделена в куче, то как быть? В таком случае не работает ни sizeof, ни memcpy. Такое происходит, вероятно, потому - что этим функциям, в случае с динамическим массиврм, приходится передавать указатель, кот-ый содержит адрес по которому расположен массив, а не сам адрес. Может можно что-то придумать?
Просто в падлу копировать каждый раз, каждый элемент структуры отдельно. Это слишком скурпулезно.
C/C++ - Как скопировать участок памяти
-
pva
Re: C/C++ - Как скопировать участок памяти
Сейчас практически во всех доступных простому смертному системах память линейная и однородная. С точки зрения копирования разницы между статической и динамической памятью нет. Компилятор автоматически перетранслирует имя массива и указатель в адрес, в этом смысле код
Код:
теперь что касается скурпулёзности
Код:
Код:
Код: Выделить всё
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++ - Как скопировать участок памяти
Цитата 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;
Пример Не муторного копирования привел, а перегрузку рператора = , кот-ая бесебя берет на себя всю муторность, нет. Хотя конечно перегрузка помогает в данном случае.
.
Сейчас практически во всех доступных простому смертному системах память линейная и однородная
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++ - Как скопировать участок памяти
Цитата ___oj:
Что-то не верится мне что так гладко дела обстоят
В windows начиная с версии 4.0 для приложений точно. В линуксе, начиная с самых первых для PC тоже всё линейно.
Цитата ___oj:
Компилятор Borland-а BCC32 выдает ошибку выделения памяти. Разве я задавал бы этот вопрос, еслиб все было так просто ?
можно код?
Цитата ___oj:
Так-же попробуй передать в какую-либо функцию любой массив и там определи его размер с помощью sizeof-а. Получешь размер типа этого массива.
обрисуй полностью задачу, а то я не догоняю, что сделать хочешь
Что-то не верится мне что так гладко дела обстоят
C/C++ - Как скопировать участок памяти
В windows начиная с версии 4.0 для приложений точно. В линуксе, начиная с самых первых для PC тоже всё линейно.
Цитата ___oj:
Компилятор Borland-а BCC32 выдает ошибку выделения памяти. Разве я задавал бы этот вопрос, еслиб все было так просто ?
C/C++ - Как скопировать участок памяти
можно код?
Цитата ___oj:
Так-же попробуй передать в какую-либо функцию любой массив и там определи его размер с помощью sizeof-а. Получешь размер типа этого массива.
C/C++ - Как скопировать участок памяти
обрисуй полностью задачу, а то я не догоняю, что сделать хочешь