如何在C++中扩展动态分配的数组?

Adn*_*vic 3 c++ c++11

当用户在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的问题,因为我正在复制指针指针数组?

我真的很感激任何帮助或建议.谢谢!

Use*_*ess 6

如果你真的不需要使用std::vector(出于教育原因),那么你的问题就在这里:

for(int i=0; i<brojUnesenih; ++i){
  delete nizKompl[i];
}
Run Code Online (Sandbox Code Playgroud)

你刚刚将这些指针复制到你新的,稍微大一点的数组.如果删除它们指向的对象,则新阵列中充满了无法使用的悬空指针.

最近的修复是:

  1. 只是不要删除这些对象.考虑转移到新阵列的所有权并使其保持活力.删除上面引用的三行.
  2. 或者,如果您确实要删除原件,则需要先复制它们 - 这意味着对象的深层副本而不是指针的浅层副本,因此您的新数组应该像

    // 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.我想不出有任何理由这样做,这只是浪费.