2010-04-07 3 views
2

Я только начинаю с C++, так что извините, если это глупый вопрос. У меня есть класс Braid, членами которого являются векторы. Я не написал оператора присваивания. Когда я много заданий на объект типа кос, я столкнулся с проблемами памяти: -У классов, у которых есть вектор, есть проблемы с памятью

0 0xb7daff89 in _int_malloc() from /lib/libc.so.6 
#1 0xb7db2583 in malloc() from /lib/libc.so.6 
#2 0xb7f8ac59 in operator new(unsigned int)() from /usr/lib/libstdc++.so.6 
#3 0x0804d05e in __gnu_cxx::new_allocator<int>::allocate (this=0xbf800204, __n=1) 
    at /usr/lib/gcc/i686-pc-linux-gnu/4.4.3/../../../../include/c++/4.4.3/ext/new_allocator.h:89 
#4 0x0804cb0e in std::_Vector_base<int, std::allocator<int> >::_M_allocate (this=0xbf800204, __n=1) 
    at /usr/lib/gcc/i686-pc-linux-gnu/4.4.3/../../../../include/c++/4.4.3/bits/stl_vector.h:140 
#5 0x0804c086 in _Vector_base (this=0xbf800204, __n=1, __a=...) 
    at /usr/lib/gcc/i686-pc-linux-gnu/4.4.3/../../../../include/c++/4.4.3/bits/stl_vector.h:113 
#6 0x0804b4b7 in vector (this=0xbf800204, __x=...) 
    at /usr/lib/gcc/i686-pc-linux-gnu/4.4.3/../../../../include/c++/4.4.3/bits/stl_vector.h:242 
#7 0x0804b234 in Braid (this=0xbf800204) at braid.h:13 
#8 0x080495ed in Braid::cycleBraid (this=0xbf8001b4) at braid.cpp:191 
#9 0x080497c6 in Braid::score (this=0xbf800298, b=...) at braid.cpp:251 
#10 0x08049c46 in Braid::evaluateMove (this=0xbf800468, move=1, pos=0, depth=2, b=...) 

Я подозреваю, что эти проблемы с памятью являются потому, что векторы становятся изменены. Я хочу знать, будут ли объекты типа Braid автоматически расширяться, когда расширяются его члены? код, который я пишу, очень длинный, поэтому я опубликую раздел, который вызывает проблемы. Вот соответствующая часть кода: -

class Braid 
{ 
private : 
    vector<int> braid; //Stores the braid. 
    int strands; 
    vector < vector<bool> > history; 
    vector < vector<bool> > CM;  
public : 
    Braid() : strands(0) {} 
    Braid operator * (Braid); 
    Braid* inputBraid(int,vector<int>); 
    int printBraid(); 
    int printBraid(vector<vector<int>::iterator>); 
    vector<int>::size_type size() const; 
       ..... 
       ..... 
} 

Вот функция, которая вызывает вопрос: -

int Braid::evaluateMove(int move,int pos,int depth,Braid b) 
{ 
int netscore = 0; 
Braid curr(*this); 
curr = curr.move(move,pos); 
netscore += curr.score(b); 

while(depth > 1) 
{ 
    netscore += curr.evaluateMove(1,0,depth,b); 
    netscore += curr.evaluateMove(2,0,depth,b); 
    for(int i = 0; i < braid.size();++i) 
    { 
    netscore += curr.evaluateMove(3,i,depth,b); 
    netscore += curr.evaluateMove(4,i,depth,b); 
    netscore += curr.evaluateMove(5,i,depth,b); 
    curr = curr.cycleBraid(); 
    netscore += curr.evaluateMove(6,0,depth,b); 
    } 
    --depth; 
} 
return netscore; 
} 
+0

'Braid * inputBraid (int, vector );' - возможно, вы хотите передать 'const vector &', чтобы избежать копирования всего вектора. – kennytm

+1

Какие проблемы с памятью? Слишком высокая память? По внешнему виду вы должны ознакомиться со ссылками и ключевым словом 'const'. – UncleBens

+0

@KennyTM: - Спасибо за подсказку. @UncleBeans: - Как я уже сказал, я полный новичок. Я как бы застрял в незавидной ситуации, когда пришлось писать код на C++ за очень короткое время, не получив должного изучения langauge. Следовательно, неизбежно будет много ошибок новичка. Во всяком случае, у меня нет памяти, но моя программа вылетает с ошибкой сегментации. Из backdrace gdb это выглядело как ошибка распределения памяти, но я мог быть совершенно ошибочным. – Jaikrishnan

ответ

3

Еще одна проблема:

while(depth > 1) 
{ 
    netscore += curr.evaluateMove(1,0,depth,b); 
    .... 
    --depth; 
} 

вызывает бесконечную рекурсию, когда глубина> 1

+0

О, я не единственный, кого это беспокоило тогда :) –

+0

Спасибо большое! Изменили его в соответствующих местах на глубину-1. Неверная ошибка, но я думаю, что я многому учусь из комментариев. – Jaikrishnan

3

быстро читать: Braid curr(*this); вызывает копию. Не можете ли вы использовать указатель на оплетку?

+0

Функция cycleBraid модифицирует Braid, поэтому я делаю временную копию. – Jaikrishnan

+0

Я бы добавил +1, если у меня остались голоса. –

+1

@Billy: Это было для вас. @user: 'curr = curr.move (move, pos);' выглядит излишним, сдувая «Braid». Этот код выглядит так, как будто ему нужны ссылки, указатели и рефакторинг, но я не могу сказать, чего пытается достичь «Braid». Это какая-то аркадная игра? –

1

На несвязанный момент, вы, вероятно, не хотите:

vector<bool> 

, как vector<bool> шаблона специализация, которые вы должны использовать только если вы действительно, действительно знаете, что вы делаете. Вместо этого рассмотрите vector <char> или deque<bool>.

+0

Я думаю, вы имели в виду «рассмотреть» вектор /vector 'или что-то и' deque 'выше ... У меня есть это право? –

+0

@ Билли, нет, я имел в виду то, что я сказал. 'Deque ' не является специализацией и имеет почти все функции, которые 'vector ' должен был иметь. – 2010-04-07 15:11:57

+0

Что именно вы имеете в виду? –

3

Я только замечанием стекового Переполнение там?

я окрашена из бесполезные биты (для целей демонстрации)

int Braid::evaluateMove(int move,int pos,int depth,Braid b) 
{ 
    #int netscore = 0; 
    #Braid curr(*this); 
    #curr = curr.move(move,pos); 
    #netscore += curr.score(b); 

    while(depth > 1) 
    { 
    netscore += curr.evaluateMove(1,0,depth,b); 
    #netscore += curr.evaluateMove(2,0,depth,b); 
    #for(int i = 0; i < braid.size();++i) 
    #{ 
    # netscore += curr.evaluateMove(3,i,depth,b); 
    # netscore += curr.evaluateMove(4,i,depth,b); 
    # netscore += curr.evaluateMove(5,i,depth,b); 
    # curr = curr.cycleBraid(); 
    # netscore += curr.evaluateMove(6,0,depth,b); 
    #} 
    --depth; 
    } 
    return netscore; 
} 

Теперь, если depth превосходит 1 ... невной

Допустим, я:

  • Braid b; b.evaluateMove(1,0,2,b);
  • оно вызывает curr.evaluateMove(1,0,2,b);
  • , который вызывает curr.evaluateMove(1,0,2,b);
  • который ...

Ну, система может не хватить памяти.

Примечание: почему evaluateMove как скопировать this и попросить копию Braid (параметр b)? Я бы проверял мой метод score, если бы был вами.

+0

Не только вы :) – a1ex07

Смежные вопросы