我是C ++的新手,请帮帮我。非常感谢。
我想将一个(新类型数组)传递给一个类。但我收到消息“在抛出bad_alloc的实例后调用c ++终止”这是什么意思?再次感谢!!!!
#include <iostream>
using namespace std;
class test {
public:
test (int*, int);
void check ();
private :
int k;
int *a= new int [k];
//int a;
};
int main()
{
//int a1=5,n=4;
int n=4;
int *a1= new int[n];
//int a1[4]={1,2,3,4};
test haha(a1,n);
haha.check();
return 0;
}
test::test(int *aa, int kk){
a=aa;
k=kk;
}
void test::check()
{
for(int i=0; i<k; i++){
cout<<a<<" ";
}
}
答案 0 :(得分:1)
class test {
public:
test (int*, int);
void check ();
private :
int k;
int *a= new int [k]; <--- problem, k is undefined + you don't allocate in class declerations
//int a;
};
你不能在课程内容中分配..特别是在未定义的成员中不能分配:)
此外..你已经指定了c'tor中的指针(不是你赋予它们任何价值......)
答案 1 :(得分:1)
这些是您的代码的所有问题,按外观顺序列出。我还为您提供了一些提示:
在C ++ 11之前的代码中不允许对非静态数据成员进行类内初始化。因此这一行无效:
private:
// ...
int *a = new int [k];
// ^^^^^^^^^^^^^^
不仅如此,这条线也是多余的。您已经有一个带指针的构造函数,并将该指针指定给a
。所以这里没有必要在课堂上进行作业。
test
的构造函数应在main
之上定义。另外,提示:您应该使用member initializer-list初始化您的成员。在您的代码中看起来像这样:
test::test(int *aa, int kk) : k(kk), a(aa) {}
// ^^^^^^^^^^^^^^
冒号后面是成员的初始化,每个成员用冒号分隔。
以下行正在打印a
k
次的地址:
cout << a << " ";
你不想这样做。您打印十六进制数字,表示内存中指针指向的地址。要打印指针指向的值,您必须取消引用指针:
cout << *a << " ";
注意:您尚未使用任何值初始化数组,因此所有打印的内容都是堆栈中的垃圾。要为数组分配一些值,你可以这样做(在main声明你的数组的地方):
int *a1 = new int[n];
a1[0] = 1;
a1[1] = 2;
a1[2] = 3;
a1[3] = 4
或者,您可以使用for循环:
for (int i = 1; i <= 4; ++i)
{
a1[i - 1] = i;
}
或者,如果你正在使用C ++ 11编译(你可能不是):
int *a1 = new int[n] {1, 2, 3, 4};
但最重要的是,当你完成使用它时,不要忘记delete[]
你的阵列。您使用new
/ new[]
创建的任何内容都必须删除:
delete[] a1;
无论如何,你可以使用std::vector
(恕我直言更好)来避免内存分配和混乱:
#include <vector>
std::vector<int> a1 = {1, 2, 3, 4};
std::vector
包含有关其大小的信息,这使得传递数组的长度变得不必要。使用矢量可以大大简化您的程序。
这就是你的计划:
#include <iostream>
#include <vector>
class test {
public:
test(std::vector<int>);
void check();
private:
std::vector<int> v;
};
test::test(std::vector<int> temp) : v(temp) {}
void test::check()
{
std::vector<int>::const_iterator it;
for (it = v.begin(); it != v.end(); ++it) {
std::cout << *it << std::endl;
}
}
int main()
{
std::vector<int> a1 = {1, 2, 3, 4};
test haha(a1);
haha.check();
}
答案 2 :(得分:0)
int k;
int *a= new int [k];
这是问题所在。在创建类实例时,k是未初始化的,并且您将其用作数组大小。
答案 3 :(得分:0)
:
int *a= new int [k];
这将导致错误:因为k尚未定义。
error: `test::k' cannot appear in a constant-expression
error: `new' cannot appear in a constant-expression
error: ISO C++ forbids initialization of member `a'
error: making `a' static
error: invalid in-class initialization of static data member of non-integral type `int*' In constructor `test::test(int*, int)':
您应该从= new int[k]
的声明中删除*a
并在构造函数中初始化*a
。
答案 4 :(得分:0)
您应该使用std :: vector而不是动态内存分配;特别是考虑到你没有删除内存。
std :: vector非常易于使用,并且有大量文档可用。见http://en.cppreference.com/w/cpp/container/vector
示例强>
std::vector<int> qux;
qux.push_back(6);
void foo(std::vector<int>& bah)
{
}
如果你必须传递一个数组,你至少应该使用std :: array,参见http://en.cppreference.com/w/cpp/container/array
<强>错误强>
std :: bad_alloc是新运算符失败时抛出的异常
如果您不想让新抛出该异常,可以使用std :: nothrow,请参阅http://en.cppreference.com/w/cpp/memory/new/nothrow
您收到此消息的原因是您传递的是未初始化的变量