Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2011, 21:56   #1
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию Классы

пишу класс string, делаю перегрузку оператора присваивания

Код:
class string{
    ...
    void operator = (string);
};

...

A=B;
не работает, вылазит ошибка вне зависимости от того, что выполняется внутри функции оператора присваивания
но если передавать по ссылке

Код:
class string{
    ...
    void operator = (string&);
};

...

A=B;
то работает на ура.
почитал страуструпа, так и не понял почему первый случай не работает.
собственно вопрос: почему?
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 15.04.2011, 22:59   #2
Damnar
Пользователь
 
Регистрация: 27.03.2011
Сообщений: 12
По умолчанию

Судя по всему, когда ты передаешь объект по значению, то запускается конструктор копирования, и возникает неопределенность, но если можно просто закопипасти ошибку которая вылетает, если можно, самому интересно
Damnar вне форума Ответить с цитированием
Старый 15.04.2011, 23:11   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

ошибка вылезает рантаймовая, и это полный ***

Код:
*** glibc detected *** /home/lis/Рабочий стол/string/test: double free or corruption (fasttop): 0x0882d018 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6(+0x6b591)[0x17b591]
/lib/tls/i686/cmov/libc.so.6(+0x6cde8)[0x17cde8]
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0x17fecd]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xcea741]
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0xcea79d]
/home/lis/Рабочий стол/string/test[0x80487da]
/home/lis/Рабочий стол/string/test[0x8048f0f]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0x126bd6]
/home/lis/Рабочий стол/string/test[0x8048501]
======= Memory map: ========
00110000-00263000 r-xp 00000000 08:06 137787     /lib/tls/i686/cmov/libc-2.11.1.so
00263000-00264000 ---p 00153000 08:06 137787     /lib/tls/i686/cmov/libc-2.11.1.so
00264000-00266000 r--p 00153000 08:06 137787     /lib/tls/i686/cmov/libc-2.11.1.so
00266000-00267000 rw-p 00155000 08:06 137787     /lib/tls/i686/cmov/libc-2.11.1.so
00267000-0026a000 rw-p 00000000 00:00 0 
0026a000-0027f000 r-xp 00000000 08:06 137736     /lib/tls/i686/cmov/libpthread-2.11.1.so
0027f000-00280000 r--p 00014000 08:06 137736     /lib/tls/i686/cmov/libpthread-2.11.1.so
00280000-00281000 rw-p 00015000 08:06 137736     /lib/tls/i686/cmov/libpthread-2.11.1.so
00281000-00283000 rw-p 00000000 00:00 0 
0037f000-00381000 r-xp 00000000 08:06 133582     /lib/tls/i686/cmov/libdl-2.11.1.so
00381000-00382000 r--p 00001000 08:06 133582     /lib/tls/i686/cmov/libdl-2.11.1.so
00382000-00383000 rw-p 00002000 08:06 133582     /lib/tls/i686/cmov/libdl-2.11.1.so
00645000-00662000 r-xp 00000000 08:06 133547     /lib/libgcc_s.so.1
00662000-00663000 r--p 0001c000 08:06 133547     /lib/libgcc_s.so.1
00663000-00664000 rw-p 0001d000 08:06 133547     /lib/libgcc_s.so.1
00845000-00908000 r-xp 00000000 08:06 527227     /usr/lib/libasound.so.2.0.0
00908000-0090c000 r--p 000c2000 08:06 527227     /usr/lib/libasound.so.2.0.0
0090c000-0090d000 rw-p 000c6000 08:06 527227     /usr/lib/libasound.so.2.0.0
00949000-00964000 r-xp 00000000 08:06 170818     /lib/ld-2.11.1.so
00964000-00965000 r--p 0001a000 08:06 170818     /lib/ld-2.11.1.so
00965000-00966000 rw-p 0001b000 08:06 170818     /lib/ld-2.11.1.so
00ad1000-00ad8000 r-xp 00000000 08:06 137793     /lib/tls/i686/cmov/librt-2.11.1.so
00ad8000-00ad9000 r--p 00006000 08:06 137793     /lib/tls/i686/cmov/librt-2.11.1.so
00ad9000-00ada000 rw-p 00007000 08:06 137793     /lib/tls/i686/cmov/librt-2.11.1.so
00b55000-00b56000 r-xp 00000000 00:00 0          [vdso]
00c2f000-00d18000 r-xp 00000000 08:06 528052     /usr/lib/libstdc++.so.6.0.13
00d18000-00d19000 ---p 000e9000 08:06 528052     /usr/lib/libstdc++.so.6.0.13
00d19000-00d1d000 r--p 000e9000 08:06 528052     /usr/lib/libstdc++.so.6.0.13
00d1d000-00d1e000 rw-p 000ed000 08:06 528052     /usr/lib/libstdc++.so.6.0.13
00d1e000-00d25000 rw-p 00000000 00:00 0 
00fbd000-00fe1000 r-xp 00000000 08:06 137789     /lib/tls/i686/cmov/libm-2.11.1.so
00fe1000-00fe2000 r--p 00023000 08:06 137789     /lib/tls/i686/cmov/libm-2.11.1.so
00fe2000-00fe3000 rw-p 00024000 08:06 137789     /lib/tls/i686/cmov/libm-2.11.1.so
08048000-0804a000 r-xp 00000000 08:06 150548     /home/lis/Рабочий стол/string/test
0804a000-0804b000 r--p 00001000 08:06 150548     /home/lis/Рабочий стол/string/test
0804b000-0804c000 rw-p 00002000 08:06 150548     /home/lis/Рабочий стол/string/test
0882d000-0884e000 rw-p 00000000 00:00 0          [heap]
b7700000-b7721000 rw-p 00000000 00:00 0 
b7721000-b7800000 ---p 00000000 00:00 0 
b7856000-b7859000 rw-p 00000000 00:00 0 
b7870000-b7872000 rw-p 00000000 00:00 0 
bf889000-bf89e000 rw-p 00000000 00:00 0          [stack]
Aborted
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 16.04.2011, 00:20   #4
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

правильная форма string& operator=(string& r) же.
у вас void operator=(string& r).
"double free" может все-таки КК?
onewho вне форума Ответить с цитированием
Старый 16.04.2011, 07:18   #5
Сtrl
C++
Форумчанин
 
Аватар для Сtrl
 
Регистрация: 27.03.2011
Сообщений: 803
По умолчанию

Цитата:
правильная форма string& operator=(string& r) же.
Вы забыли const.
Ищете информацию по C++?
cplusplus.com
Сtrl вне форума Ответить с цитированием
Старый 16.04.2011, 07:51   #6
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

почему string& operator = (string&) ?
ведь мы в текущий объект (this) записываем данные из аргумента
или я чего-то не понимаю?
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 16.04.2011, 12:32   #7
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Цитата:
Сообщение от Сtrl Посмотреть сообщение
Вы забыли const.
не принципиально, хотя безусловно недочет.

Цитата:
почему string& operator = (string&) ?
ведь мы в текущий объект (this) записываем данные из аргумента
или я чего-то не понимаю?
ну да, записываем. а потом возвращаем *this для дальнейшего использования (например в выражении a=b=c). что-то как-то хреново объяснил.


о надо же. я оказался прав.
http://ru.wikipedia.org/wiki/%D0%9E%...D0%B2_%D0%A1++

Последний раз редактировалось onewho; 16.04.2011 в 12:36.
onewho вне форума Ответить с цитированием
Старый 16.04.2011, 18:55   #8
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

аа
ну для меня пока не принципиально возвращать this, для себя же пишу
вопрос в том, почему только по ссылке работает
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 16.04.2011, 22:47   #9
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

может все таки дело в конструкторе копий? покажите его.
onewho вне форума Ответить с цитированием
Старый 17.04.2011, 10:37   #10
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Код:
void string::operator = (string &s){
    len=s.length();
    if(max<len+1){
        delete [] str;
        str=new char[max=len+1];
    };
    for(int i=0;i<len;++i)str[i]=s[i];
    str[len]=0;
};
не знаю в нем ли дело, но есть передавать не по ссылке, не работает
более того, если написать
Код:
void string::operator = (string s){

};
все равно та же ошибка О_о
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Классы casper1991 Visual C++ 6 22.02.2011 16:34
СИ++ классы!!! XOKS Помощь студентам 1 27.01.2011 21:08
классы Dimarik Общие вопросы C/C++ 1 18.09.2009 20:32