0

我的以下课程有未定义的行为?我认为它定义明确,因为我通过引用传递构造函数参数。我对吗?

class C
{
  int* elem;
  public:
    C(int s[]) :elem(s){}; // Array arguments passed by reference, so its well defined?
    void Print()
    {
      cout << elem[1] << endl;
    }
    ~C()
    {
       delete[] elem; 
    }
};
int main()
{
    C x(new int[2]{1,3});
    return 0;
}
4

2 回答 2

5

您的代码中没有未定义的行为。此外,您不是通过引用传递,而是通过值传递指针。

于 2013-11-07T11:19:21.990 回答
4

它定义明确;您正在创建一个数组,将一个有效指针传递给构造函数(它接受一个指针,尽管看起来好像它接受一个数组),存储该指针,然后通过它访问一个有效的数组元素。

唯一的问题是内存泄漏——你永远不会删除数组。

更新现在你已经添加了一个析构函数来删除数组,这个类是非常危险的——如果你复制它,那么两个副本都会尝试删除同一个数组。这导致未定义的行为。您需要根据三法则防止复制或正确实施。如果指针不是指向使用new[].

一旦你学会了如何手动管理资源,以及正确掌握所有细节是多么困难,你通常会使用一个库类来为你做这件事。在这种情况下,std::vector<int>将是理想的。这样做有时被称为“零规则”(如评论中所述),因为它完全不需要编写自己的析构函数或复制/移动语义 - 它们都来自您正在使用的类,有人已经正确实施了。

于 2013-11-07T11:19:02.980 回答