![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Madest |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 27.11.2003 Где: Городок Репутация: нет Всего: нет |
Есть класс AAA.
В нем есть BYTE* pb и метод f(аргументы), где pb выделяется память. vector<AAA> v; AAA aaa; CString s; for(int x=0;x<10;x++) { aaa.f(аргументы); v.push_back(aaa); } адрес pb иногда одинаковый и наверное поэтому вылетает на строке v.push_back(aaa);. Почему адрес одинаковый? Конструктор копий есть. Может в нем не так чего написал? AAA::AAA(const AAA& a) { pb=a.pb; } Причем, если закомментировать добавление к вектору - адрес pb везде разный. И еще: добавил в конструктор копий AfxMessageBox, так при увеличении x в цикле увеличивается количество вызовов конструктора копий при v.push_back(aaa);. Почему? Это сообщение отредактировал(а) Madest - 24.3.2004, 15:50 --------------------
|
|||
|
||||
bel_nikita |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Конечно не так!!! Где выделение памяти для pb конструкторе копии??? Приведи более подробный код конструктора. |
||||||
|
|||||||
Madest |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 27.11.2003 Где: Городок Репутация: нет Всего: нет |
Сколько памяти нужно указателям заранее неизвестно.
Вот это все что есть: CRaster::CRaster() { m_pData=NULL; m_pBMI=NULL; BPL=0; bit=0; } CRaster::CRaster(const CRaster& rz) { AfxMessageBox("copy const"); m_pBMI=rz.m_pBMI; m_pData=rz.m_pData; } Чуствую чего-то не догоняю... В общем вот кусок кода. Если закомментировать push_back(), адреса все разные. А с ним они друг на друга лезут, хоть и массив CRaster* сделал. CRaster* ra=new CRaster[numrows]; for(WORD x=0;x<numrows;x++) { pFrame->db->row=mysql_fetch_row(pFrame->db->res); (ra+x)->MakeBIHfromDICOM(*(pFrame->db->row+4)); s.Format("%x,%x",(ra+x)->m_pBMI,(ra+x)->m_pData); AfxMessageBox(s); lz.push_back(*(ra+x)); s.Format("vector - %x,%x",lz[x].m_pBMI,lz[x].m_pData); AfxMessageBox(s); } Это сообщение отредактировал(а) Madest - 24.3.2004, 17:36 --------------------
|
|||
|
||||
sergejzr |
|
||||||
![]() Un salsero ![]() Профиль Группа: Админ Сообщений: 13285 Регистрация: 10.2.2004 Где: Германия г .Ганновер Репутация: 19 Всего: 360 |
pb=a.pb; естественно, что адреса одинаковые после копии(который вектор вызывает например при pushback). такой конструктор копий можно было бы самому и не писать, по умолчанию С++ делает точно такой же. То есть приравнивает указатели. А нам надо именно копировать содержимое. см. выше bel_nikita если тебе действительно никак до длинны pb не добраться, делай вектор из указателей на AAA.
С указателями такого не будет. Посмотри, как устроен вектор и всё сразу станет понятно. Это сообщение отредактировал(а) sergej.z - 24.3.2004, 18:30 |
||||||
|
|||||||
bel_nikita |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2304 Регистрация: 12.10.2003 Где: Поезд №21/22 ( ст . Прага ) Репутация: 21 Всего: 47 |
Madest
А это неважно. Важно то, что в процессе выделяешь память для BYTE* pb. Я правильно тебя понял? Соответственно в конструкторе копии ты должен заново выделить память под pb. А потом скопировать в ентот самый pb все, что надо. Иди pb просто хранит указатель? |
|||
|
||||
Madest |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 27.11.2003 Где: Городок Репутация: нет Всего: нет |
Большое вам спасибо!
--------------------
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |