为什么会抛出此错误的\u alloc异常? 我对C++是全新的,并且想尝试做一个简单的泛型(不确定这是适当的术语)数组类,它本质上是java中的数组(主要用于方便长度字段)。 以下是所有代码: #include <iostream> template <typename T> class Array { private: T* ar; public: const unsigned int length; Array(unsigned int length_) : length(length_), ar(new T[length]) {} void insert(unsigned int, T); T& get(unsigned int); T& operator[](unsigned int); }; template <typename T> void Array<T>::insert(unsigned int index, T dataToAdd) { if(index>=length) {throw -1;} ar[index]=dataToAdd; } template <typename T> T& Array<T>::get(unsigned int index) { if(index>=length) {throw -1;} return ar[index]; } template <typename T> T& Array<T>::operator[](unsigned int index) {return this->get(index);} int main() { std::cout << "main start\n"; Array<int> nums1=Array<int>(2); nums1[0]=4; nums1[1]=10; std::cout << "length of nums1:" << nums1.length << "\n"; Array<int> nums2=Array<int>(2); nums2[0]=8; nums2[1]=5; std::cout << "length of nums2:" << nums2.length << "\n"; Array<int> nums3=Array<int>(2); std::cout << "nums3 created\n"; nums2[0]=3; std::cout << "added to index 0\n"; nums2[1]=15; std::cout << "added to index 1\n"; std::cout << "length of nums3:" << nums3.length <<"\n"; std::cout << "main end\n"; }

为什么会抛出此错误的\u alloc异常? 我对C++是全新的,并且想尝试做一个简单的泛型(不确定这是适当的术语)数组类,它本质上是java中的数组(主要用于方便长度字段)。 以下是所有代码: #include <iostream> template <typename T> class Array { private: T* ar; public: const unsigned int length; Array(unsigned int length_) : length(length_), ar(new T[length]) {} void insert(unsigned int, T); T& get(unsigned int); T& operator[](unsigned int); }; template <typename T> void Array<T>::insert(unsigned int index, T dataToAdd) { if(index>=length) {throw -1;} ar[index]=dataToAdd; } template <typename T> T& Array<T>::get(unsigned int index) { if(index>=length) {throw -1;} return ar[index]; } template <typename T> T& Array<T>::operator[](unsigned int index) {return this->get(index);} int main() { std::cout << "main start\n"; Array<int> nums1=Array<int>(2); nums1[0]=4; nums1[1]=10; std::cout << "length of nums1:" << nums1.length << "\n"; Array<int> nums2=Array<int>(2); nums2[0]=8; nums2[1]=5; std::cout << "length of nums2:" << nums2.length << "\n"; Array<int> nums3=Array<int>(2); std::cout << "nums3 created\n"; nums2[0]=3; std::cout << "added to index 0\n"; nums2[1]=15; std::cout << "added to index 1\n"; std::cout << "length of nums3:" << nums3.length <<"\n"; std::cout << "main end\n"; },c++,bad-alloc,C++,Bad Alloc,由于cout打印的最后一个内容是nums2:2的长度,因此我假设在以下行引发异常:Array nums3=Array(2) 这是什么原因?我不能内存不足,可以吗?无论初始化行的顺序如何,成员变量都会按照它们在类中声明的顺序初始化。因此: private: T* ar; public: const unsigned int length; 表示将在length之前初始化ar,因此: Array(unsigned int length_) : length(length_), ar

由于
cout
打印的最后一个内容是nums2:2的长度,因此我假设在以下行引发异常:
Array nums3=Array(2)


这是什么原因?我不能内存不足,可以吗?

无论初始化行的顺序如何,成员变量都会按照它们在类中声明的顺序初始化。因此:

private:
    T* ar;
public:
    const unsigned int length;
表示将在
length
之前初始化
ar
,因此:

Array(unsigned int length_) : length(length_), ar(new T[length]) {}

在构造之前正在使用
长度
。更改成员变量的类decl顺序,或者在构建
ar

时使用
length\ucode>,无论初始化行的顺序如何,成员变量都会按照在类中声明的顺序初始化。因此:

private:
    T* ar;
public:
    const unsigned int length;
表示将在
length
之前初始化
ar
,因此:

Array(unsigned int length_) : length(length_), ar(new T[length]) {}

在构造之前正在使用
长度
。更改成员变量的类decl顺序,或者在构建
ar

时使用
length\ucode>,无论初始化行的顺序如何,成员变量都会按照在类中声明的顺序初始化。因此:

private:
    T* ar;
public:
    const unsigned int length;
表示将在
length
之前初始化
ar
,因此:

Array(unsigned int length_) : length(length_), ar(new T[length]) {}

在构造之前正在使用
长度
。更改成员变量的类decl顺序,或者在构建
ar

时使用
length\ucode>,无论初始化行的顺序如何,成员变量都会按照在类中声明的顺序初始化。因此:

private:
    T* ar;
public:
    const unsigned int length;
表示将在
length
之前初始化
ar
,因此:

Array(unsigned int length_) : length(length_), ar(new T[length]) {}



在构造之前正在使用
长度
。要么更改成员变量的类decl顺序,要么在
ar
的构造中使用
length\uu
这样更改构造函数对我来说很有效:
Array(unsigned int length):length(length),ar(new T[length\uu]){}
因为你是新来的:请不要使用“刚刚好”或“工作得很好”。如果应用了这些词,你就不需要发帖了。我想你需要了解一下标准库,并发现这门课对你没有用处。除了作为学习语言的一种手段,它对我也很有用,谢谢!但是,它为什么工作?除了答案,请记住,在C++中,应该释放分配给<代码>新< /COD>的内存。因此,您的类需要一个析构函数,例如
~Array(){delete[]ar;}
以这种方式更改构造函数对我来说很有效:
数组(unsigned int length):length(length),ar(new T[length){}
,因为您是新来的:请不要使用“刚刚好”或“工作完美”这两个词。如果应用了这些词,你就不需要发帖了。我想你需要了解一下标准库,并发现这门课对你没有用处。除了作为学习语言的一种手段,它对我也很有用,谢谢!但是,它为什么工作?除了答案,请记住,在C++中,应该释放分配给<代码>新< /COD>的内存。因此,您的类需要一个析构函数,例如
~Array(){delete[]ar;}
以这种方式更改构造函数对我来说很有效:
数组(unsigned int length):length(length),ar(new T[length){}
,因为您是新来的:请不要使用“刚刚好”或“工作完美”这两个词。如果应用了这些词,你就不需要发帖了。我想你需要了解一下标准库,并发现这门课对你没有用处。除了作为学习语言的一种手段,它对我也很有用,谢谢!但是,它为什么工作?除了答案,请记住,在C++中,应该释放分配给<代码>新< /COD>的内存。因此,您的类需要一个析构函数,例如
~Array(){delete[]ar;}
以这种方式更改构造函数对我来说很有效:
数组(unsigned int length):length(length),ar(new T[length){}
,因为您是新来的:请不要使用“刚刚好”或“工作完美”这两个词。如果应用了这些词,你就不需要发帖了。我想你需要了解一下标准库,并发现这门课对你没有用处。除了作为学习语言的一种手段,它对我也很有用,谢谢!但是,它为什么工作?除了答案,请记住,在C++中,应该释放分配给<代码>新< /COD>的内存。因此,您的类需要一个析构函数,例如
~Array(){delete[]ar;}
构造函数可以使用
length
很好。@Rapptz如前所述,不,它不能。它的价值是不确定的。如果类decl中的顺序被切换(正如我在回答中所说的),那么它“很好”,因为它将在
ar
之前被初始化。如果
length
已经初始化,构造函数可以引用
length
并期望一个定义良好的值。关于构造函数的讨论是没有意义的,因为问题是初始值设定项列表。@DavidHeffernan必须有几十个重复项,如果我能找到一个,我会删除它并将其链接。我不知道OP需要多少时间才能得到答案。好吧,放弃它就好了。我不能放弃一个被接受的答案(至少我没有勇气这么做)。尽管如此,我还是链接了。希望将来的读者能读到。构造函数可以使用
长度
很好。@Rapptz如前所述,不,它不能。它的价值是不确定的。如果类decl中的顺序被切换(如我在回答中所说),那么它“很好”,因为它将在
ar
之前被初始化。构造函数可以引用
length
并期望一个定义良好的val