crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> копирование и память
rp80
  опции профиля:
сообщение 22.12.2011, 13:47
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 36
Регистрация: 10.9.2011
Пользователь №: 2860

Спасибо сказали: 0 раз(а)




Репутация:   0  


Копирование указателя на объект не приводит к копированию объекта.
Значит следующий код приведет к утечки памяти:

    const char* c =new char[30];
    const char* cc="zca";
    c=cc;//потеряны 30 байт на которые указывал с


Правильно копировать так:
    char* c =new char[30];
    char* cc="zca";
    delete[] c;
    c=new char[sizeof(cc)];
    for(size_t i=0;i<sizeof(cc);++i)
    c[i]=cc[i];


А что происходит при копировании переменных в стеке?
const char* s="xzczv";
const char* s1="vvb";
s=s1;//s и s1 указывают на одно и тоже место в памяти

Теряется ли память выделенная первоначально под s?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
ilyabvt
  опции профиля:
сообщение 22.12.2011, 17:50
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Цитата(rp80 @ 22.12.2011, 13:47) *
Правильно копировать так:
    char* c =new char[30];
    char* cc="zca";
    delete[] c;
    c=new char[sizeof(cc)];
    for(size_t i=0;i<sizeof(cc);++i)
    c[i]=cc[i];

Не правильно. sizeof(cc) вернет размер указателя, а не массива. В данном случае это сработает только по тому что вы создали 4-х байтный массив.

Цитата
а если это оптимизированное хранение констант в сегменте кода, то их в принципе невозможно удалить

Теоретически возможно. Только это путь даже не джедая, а какого-то безумного ситха, ибо придется не только найти строки в памяти и удалить, но и подредактировать код (не исходный, а тот что висит в памяти в виде процессорных иструкций) так чтобы прога думала что никакой переменной и не существовало. :D

Сообщение отредактировал ilyabvt - 22.12.2011, 17:50
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 22.12.2011, 20:35
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(ilyabvt @ 22.12.2011, 20:50) *
Теоретически возможно. Только это путь даже не джедая, а какого-то безумного ситха, ибо придется не только найти строки в памяти и удалить, но и подредактировать код (не исходный, а тот что висит в памяти в виде процессорных иструкций) так чтобы прога думала что никакой переменной и не существовало. :D

нет. сегмент кода не может менять содержимое ни в одной из современных осей. это главное правило: код не может модифицировать сам себя. это только в DOSе можно было писать такие кренделя. любая защищённая система этого не позволяет.
модифицировать можно исполняемый файл, например. или в отладчике писать какие-то значения в регистры. или подгружать какие-то библиотеки на ходу. но сама программа себя менять никак не может. просто нет прав на запись в сегмент кода.

Цитата(rp80 @ 22.12.2011, 23:31) *
Хорошо, а где хранятся данные переменных? В самом стеке? И в примере с чтением из файла в какой-то момент будет переполнение стека, если файл достаточно большой?

смотря каких. константы могут быть сложены в сегмент кода (раз они не меняются). переменные, которые обычные - в сегменте данных. можно ещё регистровые переменные создавать - они, соответственно, будут размещены в регистрах, если компилятор сможет их так распределить. если не сможет - то всё равно в сегменте данных.


Сообщение отредактировал Iron Bug - 22.12.2011, 20:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- rp80   копирование и память   22.12.2011, 13:47
- - Алексей1153   Цитата(rp80 @ 22.12.2011, 16:47) Правильн...   22.12.2011, 13:52
|- - rp80   Цитата(Алексей1153 @ 22.12.2011, 14:52) л...   22.12.2011, 14:06
- - BRE   Цитата(rp80 @ 22.12.2011, 14:47) А что пр...   22.12.2011, 13:53
- - Iron Bug   Цитата(rp80 @ 22.12.2011, 16:47) А что пр...   22.12.2011, 14:03
- - Iron Bug   Цитата(rp80 @ 22.12.2011, 17:06) Понятно,...   22.12.2011, 14:47
|- - rp80   Цитата(Iron Bug @ 22.12.2011, 15:47) ну, ...   22.12.2011, 14:54
|- - BRE   Цитата(rp80 @ 22.12.2011, 15:54) что конк...   22.12.2011, 15:07
- - Iron Bug   Цитата(rp80 @ 22.12.2011, 17:54) Но вопро...   22.12.2011, 15:01
|- - rp80   Цитата(Iron Bug @ 22.12.2011, 16:01) при ...   22.12.2011, 15:47
- - Iron Bug   Цитата(rp80 @ 22.12.2011, 15:47) В какое?...   22.12.2011, 16:03
|- - rp80   Цитата(Iron Bug @ 22.12.2011, 17:03) с ко...   22.12.2011, 19:17
|- - ilyabvt   Цитата(rp80 @ 22.12.2011, 22:17) Цитата(I...   22.12.2011, 19:50
|- - rp80   Цитата(ilyabvt @ 22.12.2011, 20:50) Не за...   22.12.2011, 20:03
|- - ilyabvt   Цитата(rp80 @ 22.12.2011, 23:03) Цитата(i...   22.12.2011, 20:13
|- - rp80   Цитата(ilyabvt @ 22.12.2011, 21:13) Нет к...   22.12.2011, 20:31
- - ilyabvt   Цитата(rp80 @ 22.12.2011, 13:47) Правильн...   22.12.2011, 17:50
|- - Iron Bug   Цитата(ilyabvt @ 22.12.2011, 20:50) Теоре...   22.12.2011, 20:35
|- - rp80   Цитата(Iron Bug @ 22.12.2011, 21:35) смот...   22.12.2011, 23:11
- - Алексей1153   rp80, стек то никуда не девается. А то, что ты пра...   23.12.2011, 7:33
|- - rp80   Цитата(Алексей1153 @ 23.12.2011, 8:33) rp...   23.12.2011, 9:46
- - Iron Bug   Цитата(rp80 @ 23.12.2011, 2:11) Вообще во...   23.12.2011, 7:41
|- - BRE   Цитата(Iron Bug @ 23.12.2011, 8:41) если ...   23.12.2011, 9:17
- - Алексей1153   rp80, значит компилятор разместил переменную не та...   23.12.2011, 9:49
- - Iron Bug   Цитата(BRE @ 23.12.2011, 12:17) (в сегмен...   23.12.2011, 9:55
|- - BRE   Цитата(Iron Bug @ 23.12.2011, 10:55) а, н...   23.12.2011, 10:23
|- - rp80   Цитата(Iron Bug @ 23.12.2011, 10:55) я в ...   23.12.2011, 10:39
|- - BRE   Цитата(rp80 @ 23.12.2011, 11:39) Т.е. ско...   23.12.2011, 10:56
- - Алексей1153   rp80, как разберёшься с указателями на массивы, от...   23.12.2011, 10:41
|- - rp80   Цитата(Алексей1153 @ 23.12.2011, 11:41) r...   23.12.2011, 10:47
- - Алексей1153   rp80, class A { public: int ar[3...   23.12.2011, 14:36


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.4.2024, 17:28