我的下一课有未定义的行为?我认为它很明确,因为我通过引用传递构造函数参数。我是对的吗?
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;
}
答案 0 :(得分:5)
您的代码中没有未定义的行为。此外,你不是通过引用传递,而是按值传递指针。
答案 1 :(得分:4)
它定义明确;你正在创建一个数组,传递一个有效的指针到构造函数(它接受一个指针,尽管看起来好像它需要一个数组),存储该指针,然后通过它访问一个有效的数组元素。
唯一的问题是内存泄漏 - 你永远不会删除数组。
UPDATE 现在你已经添加了一个析构函数来删除数组,这个类非常危险 - 如果你复制它,那么两个副本都会尝试删除相同的数组。 将导致未定义的行为。您需要根据Rule of Three阻止复制或正确实施。如果指针不是使用new[]
创建的数组,则还会得到未定义的行为。
一旦您学会了如何手动管理资源,以及获得所有细节的难度,您通常会使用库类来为您完成。在这种情况下,std::vector<int>
将是理想的。这样做有时被称为“零规则”(如评论中所述),因为它根本不需要编写自己的析构函数或复制/移动语义 - 它们都来自您正在使用的类,有人已经正确实施。