我刚刚开始使用C ++,很抱歉,如果这是一个愚蠢的问题。我有一个类Braid,其成员是向量。我没有写过赋值运算符。当我对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 :(得分:3)
快速阅读:Braid curr(*this);
会导致副本。你不能使用指向辫子的指针吗?
答案 1 :(得分:3)
另一个问题:
while(depth > 1)
{
netscore += curr.evaluateMove(1,0,depth,b);
....
--depth;
}
在深度> 1
时导致无限递归答案 2 :(得分:3)
我是唯一一个在那里发现Stack Overflow的人吗?
我为无用的比特着色(为了演示的目的)
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
... oups
我想说:
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
方法。
答案 3 :(得分:1)
在一个不相关的点上,你可能不想要:
vector<bool>
因为vector<bool>
是一个模板专业化,你应该只使用它,如果你真的,真的知道你在做什么。请改为考虑vector <char>
或deque<bool>
。