当我的程序试图将一个对象分配给另一个时,我的程序崩溃了,你这个人看到了什么问题吗?
变量是:
Field *fields[50];
int numOfFields;
int currentField;
功能是:
Screen& operator=(Screen &scr) {
if (this != &scr){
for (int i = 0; i < 50; i++)
fields[i] = NULL;
for (int i = 0; i < scr.numOfFields; i++)
fields[i] = scr.fields[i];
numOfFields = scr.numOfFields;
currentField = scr.currentField;
}
return *this;
}
答案 0 :(得分:1)
一个问题可能是scr.numOfFields超出了目标对象中的字段数。
另一个问题是,或者至少看起来,你正在为新对象分配指针。这意味着您将在程序中两次引用相同的位置。如果它在一个地方被删除而另一个不知道它会发生什么?当您尝试访问内存时,您将遇到seg错误。
如果你有Boost,你可以使用他们的共享指针来帮助避免这种情况:http://www.boost.org/doc/libs/1_43_0/libs/smart_ptr/smart_ptr.htm
答案 1 :(得分:0)
您应该使用std::vector
代替动态数组,我怀疑您的问题会很快消失。
根据MadCap的建议,您还应该使用共享指针,因为这是使用指针与容器时的最佳做法。这也将为您提供您期望的复制语义。
这将否定对此的需求:
for (int i = 0; i < 50; i++)
fields[i] = NULL;
你可以替换它:
for (int i = 0; i < scr.numOfFields; i++)
fields[i] = scr.fields[i];
使用std :: copy,类似于:
fields.clear()
std::copy(scr.fields.begin(), scr.fields.end(), fields.begin());
通过执行此操作,您将消除由于某些指针访问或初始化错误而发生崩溃的可能性。
简单的建议是;停止使用动态数组和原始指针并开始使用std::vector
和boost::shared_ptr
,而这样做有助于防止遇到这些问题。