类构造函数是否具有未定义的行为

时间:2013-11-07 11:15:23

标签: c++ c++11

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

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;
}

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

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

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

UPDATE 现在你已经添加了一个析构函数来删除数组,这个类非常危险 - 如果你复制它,那么两个副本都会尝试删除相同的数组。 导致未定义的行为。您需要根据Rule of Three阻止复制或正确实施。如果指针不是使用new[]创建的数组,则还会得到未定义的行为。

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