当用户在main中输入新数据时,我试图实现数组动态扩展的解决方案,如下所示:
ComplexNumber** nizKompl = new ComplexNumber*[1];
bool unos = true;
while(unos){
cout << "Unesite novi kompleksni broj(realni imaginarni): ";
if(cin >> re >> im){
nizKompl[brojUnesenih] = new ComplexNumber(re,im);
++brojUnesenih;
ComplexNumber** nizTemp = new ComplexNumber*[brojUnesenih+1];
copy(nizKompl, nizKompl+brojUnesenih, nizTemp);
for(int i=0; i<brojUnesenih; ++i){
delete nizKompl[i];
}
delete [] nizKompl;
nizKompl = nizTemp;
} else {
cout << endl << endl;
unos = false;
}
}
Run Code Online (Sandbox Code Playgroud)
ComplexNumber是自定义类型.ComplexNumber工作正常但我遇到双重免费或损坏错误的问题,因为我正在输入新数据并在程序中创建新的ComplexNumbers.
有没有更好的方法来实现这一目标? 我需要使用自己的动态数组而不是std :: vector,因为它是出于教育目的.
据我所知,当您尝试释放已经免费的内存时,会发生双重自由错误.但似乎我无法解决这个问题,因为我看不到双重自由应该发生.
记忆中发生的事情我不知道吗?这是std :: copy的问题,因为我正在复制指针指针数组?
我真的很感激任何帮助或建议.谢谢!
如果你真的不需要使用std::vector(出于教育原因),那么你的问题就在这里:
for(int i=0; i<brojUnesenih; ++i){
delete nizKompl[i];
}
Run Code Online (Sandbox Code Playgroud)
你刚刚将这些指针复制到你新的,稍微大一点的数组.如果删除它们指向的对象,则新阵列中充满了无法使用的悬空指针.
最近的修复是:
或者,如果您确实要删除原件,则需要先复制它们 - 这意味着对象的深层副本而不是指针的浅层副本,因此您的新数组应该像
// shallow copy:
// copy(nizKompl, nizKompl+brojUnesenih, nizTemp);
// deep copy:
transform(nizKompl, nizKompl+brojUnesenih, nizTemp, clone);
Run Code Online (Sandbox Code Playgroud)
与功能
ComplexNumber* clone(ComplexNumber *original) {
return new ComplexNumber(*original);
}
Run Code Online (Sandbox Code Playgroud)
NB.我想不出有任何理由这样做,这只是浪费.