【问题标题】:How to handle passing runtime-sized arrays between classes in C++如何处理在 C++ 中的类之间传递运行时大小的数组
【发布时间】:2009-05-07 15:08:03
【问题描述】:

现在我有一个简单的类,可以将 XML 文件解析为对我有用的整数。看起来像这样:

int* DataParser::getInts(){
    *objectNumbers = new int[getSize()];
    for (int i=0;i<getSize();i++){
            objectNumbers[i]=activeNode->GetNextChild()->GetContent();
    }
    return objectNumbers;
 }

在程序的主要部分,我通过以下方式收到:

int* numbers= data->getInts();
///Do things to numbers[]
delete numbers;

在删除命令之前一切正常,这会使一切崩溃。这样做的正确方法是什么?

【问题讨论】:

    标签: c++ arrays memory


    【解决方案1】:

    部分问题在于您没有将 new[] 与 delete[] 配对。这可能不是您的错误的根源,但您应该养成这样做的习惯。

    几乎可以肯定,该错误与您注释掉的代码有关。您能否在此处添加更多上下文,以便我们可以看到您对数字值做了什么?

    一般来说,我发现使用向量来解决这类问题要容易得多。它将内存管理排除在外,并具有使用动态内存存储大小的额外好处。

    void DataParser::getInts(std::vector<int>& objectNumbers){
        for (int i=0;i<getSize();i++){
          objectNumbers.push_back(activeNode->GetNextChild()->GetContent());
        }
     }
    
    ...
    std::vector<int> numbers;
    data.getInts(numbers);
    

    【讨论】:

      【解决方案2】:

      你需要

      delete [] numbers;
      

      规则是无论何时

      ptr = new Type[...];
      

      确保你

      delete [] ptr;
      

      而不是常规

      delete ptr;
      

      这将导致未定义的行为(感谢 Neil Butterworth),旨在删除 ptr 指向的单个实例,而不是数组。

      【讨论】:

      • 实际上,它很可能根本无法“工作”——它给出了 C++ 标准所称的“未定义行为”。
      • 是的,我试图传达删除 ptr 的语义;是,但最好包括其未定义的行为。谢谢。
      【解决方案3】:

      下面一行:

       *objectNumbers = new int[getSize()];
      

      它有什么作用?如果你返回objectNumbers,这是一个指向int的指针,你真的应该这样做:

       objectNumbers = new int[getSize()];
      

      无论如何,C++ 为您提供了集合(vectorlist 等)——我会使用其中一个而不是普通数组。如其他地方所述,将newdeletenew []delete [] 匹配很重要。

      传递数组并不是好的设计——你将实现公开。尝试将迭代器传递到 ints 的数组/集合/序列的开头和结尾,而不是遵循 STL 设计。

      【讨论】:

        【解决方案4】:

        只需使用 std::vector 代替;

        std::vector<int> DataParser::getInts(){
            std::vector<int> objectNumbers(getSize());
            for (int i=0;i<getSize();i++){
                    objectNumbers[i]=activeNode->GetNextChild()->GetContent();
            }
            return objectNumbers;
         }
        

        【讨论】:

        • 此代码将在返回时生成矢量内容的副本。恐怕不止一次。 JaredPar 的示例是正确的方法。通过引用传递向量并将其填充到 getInts 中。
        • 不一定,这段代码通常会受益于返回值优化。
        【解决方案5】:

        您很快就会遇到麻烦和维护问题。考虑使用 std::vector,这是正确的做法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-01-09
          • 2011-06-18
          • 1970-01-01
          • 1970-01-01
          • 2020-01-28
          • 1970-01-01
          • 2016-08-06
          相关资源
          最近更新 更多