是类构造器具有未定义的行为
Is class contructor has undefined behaviour
我的下一个类有未定义的行为?我认为它定义得很好,因为我正在通过引用传递构造函数参数。我说的对吗?
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;
}
代码中没有未定义的行为。此外,您不是通过引用传递,而是按值传递指针。
它是明确定义的;你正在创建一个数组,将一个有效的指针传递给构造函数(构造函数需要一个指针,尽管它看起来好像需要一个数组),存储该指针,然后通过它访问一个有效的数组元素。
唯一的问题是内存泄漏 - 您永远不会删除数组。
更新 现在你已经添加了一个析构函数来删除数组,这个类是非常危险的 - 如果你复制它,那么两个副本都会尝试删除同一个数组。这将导致未定义的行为。您需要根据三法则防止复制或正确实施复制。如果指针不是指向使用 new[]
创建的数组,您还将获得未定义的行为。
一旦你学会了如何手动管理资源,以及正确处理所有细节是多么困难,你通常会使用库类来为你做这件事。在这种情况下,std::vector<int>
将是理想的。这样做有时被称为"零规则"(如注释中所述),因为它完全不需要编写自己的析构函数或复制/移动语义 - 它们都来自您正在使用的类,有人已经正确实现了。
相关文章:
- 链接器错误:未定义对"Reference_Genome::seq[abi:cxx11]"的引用
- 没有默认构造函数作为模板参数的自定义比较器
- 只有级联分类器会发出未定义的引用错误
- Windows 链接器是否使用 LoadLibrary 解析 DLL 中未定义的符号?
- "未定义对'WinMain@16'的引用"gcc 编辑器中的错误
- 为什么我会收到链接器错误:未定义对 ..?
- CLion - 无法解决类中对构造函数的未定义引用
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- ld 链接器错误,未定义对主函数的引用
- 尝试构建 xerces c++ 解析器。Netbeans 和命令行构建错误未定义对"xercesc_3_2..."的引用
- 如何在 Linux 中构建共享库时使未定义引用的链接器失败
- Android NDK.Build命令失败.未定义的引用.clang++:错误:链接器命令失败,退出代码为1
- 正在通过const-ref未定义的行为捕获新构造的对象
- 链接器错误,未定义对模板化构造函数的引用
- 安装额外模块openCV后未定义跟踪器
- 如何在vc++中使用samplegrabber?未定义采样器
- 在C++中定义构造器的更好方法是什么?初始化列表或 Ctor 正文中的初始化
- c++未定义构造函数
- XCode链接器错误,未定义的引用,模板,构造