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?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Iron Bug
  опции профиля:
сообщение 23.12.2011, 9:55
Сообщение #2


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

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

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




Репутация:   12  


Цитата(BRE @ 23.12.2011, 12:17) *
(в сегментных регистрах храняться уже не адреса, а дескрипторы сегментов из специальных дескрипторных таблицах GDT или LDT

а, ну да. тут ещё оттуда придётся тащить данные. у дров есть функция взятия физического адреса, а вот в юзерспейсе я чота не помню, есть такая фича или нет... я-то живу в основном в кернеле :) а для 64 бит GDT чистая абстракция - там один хрен всё линейно.
в общем, тогда лучше не пытаться гадать, а взять какой-нить стандарт ELF или вендозные спецификации и почитать про конкретные оси и конкретные компиляторы. впрочем, от этого разницы никакой не будет. для программиста интерес представляет размер стека, оптимизация работы с указателями и решение использования стека или кучи. я в юзерских программах не парюсь и использую кучу. ибо она практически не ограничена и чаще всего скорость доступа совершенно не критична, так как юзерские программы обычно и без того тормозят из-за вывода и экономия на адресах не даёт никакого эффекта.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
rp80
  опции профиля:
сообщение 23.12.2011, 10:39
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(Iron Bug @ 23.12.2011, 10:55) *
я в юзерских программах не парюсь и использую кучу. ибо она практически не ограничена и чаще всего скорость доступа совершенно не критична, так как юзерские программы обычно и без того тормозят из-за вывода и экономия на адресах не даёт никакого эффекта.


Я бы тоже не стал лазить в такие дебри. Но стал тут разбираться с копированием объектов и вот такое поведение непонятно.
class A
{
    public:
    int ar[3];
    int* pi;
    char* str;
    A(){ar[0]=ar[1]=ar[2]=0;pi=new int[3];}
};

int main()
{
    A a1,a2;
    a2=a1;
    a1.ar[0]=98;
    a1.pi[0]=123;
    a1.str="zxcf";
    std::cout<<a2.ar[0]<<"\n"<<a2.pi[0]<<"\n"<<a2.str<<std::endl;
}

Выводит: 0 - 123 - Segmentation fault.
Т.е. скопировался как надо только указатель на динамически выделенную память.

Сообщение отредактировал rp80 - 23.12.2011, 10:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 24.5.2025, 15:29