我正在努力掌握指针和它们的精彩以及更好的C ++理解。我不知道为什么这不会编译。请告诉我有什么问题?我正在尝试在创建类的实例时初始化指针。如果我尝试使用普通的int它可以正常工作但是当我尝试用指针设置它时我会在控制台中看到它
跑步......
构造函数名为
编程接收信号:“EXC_BAD_ACCESS”。
sharedlibrary apply-load-rules all
非常感谢任何帮助。
这是代码
#include <iostream>
using namespace std;
class Agents
{
public:
Agents();
~Agents();
int getTenure();
void setTenure(int tenure);
private:
int * itsTenure;
};
Agents::Agents()
{
cout << "Constructor called \n";
*itsTenure = 0;
}
Agents::~Agents()
{
cout << "Destructor called \n";
}
int Agents::getTenure()
{
return *itsTenure;
}
void Agents::setTenure(int tenure)
{
*itsTenure = tenure;
}
int main()
{
Agents wilson;
cout << "This employees been here " << wilson.getTenure() << " years.\n";
wilson.setTenure(5);
cout << "My mistake they have been here " << wilson.getTenure() <<
" years. Yep the class worked with pointers.\n";
return 0;
}
答案 0 :(得分:10)
您永远不会创建指针指向的int,因此指针指向不存在的内存区域(或用于其他内容)。
您可以使用new
从堆中获取内存块,new返回内存位置的地址。
itsTenure = new int;
所以现在itsTenure
保存了你可以取消引用它以设置其值的内存位置。
更改的构造函数如下:
Agents::Agents()
{
cout << "Constructor called \n";
itsTenure = new int;
*itsTenure = 0;
}
但您还必须记住使用delete
Agents::~Agents()
{
cout << "Destructor called \n";
delete itsTenure;
}
答案 1 :(得分:4)
你只是在构造函数中缺少一个新的。
itsTenure = new int;
但是,您不需要将其作为指针。你好吗?
答案 2 :(得分:3)
您必须为int分配一块内存,然后才使用此内存块的地址(指针)。这是通过new
:
cout << "Destructor called \n";
itsTenure = new int;
*itsTenure = 0;
然后你必须使用delete:
释放析构函数中的内存 cout << "Destructor called \n";
delete itsTenur;
答案 3 :(得分:3)
*itsTenure = 0
未初始化指针。它将0写入itsTenure指向的位置。由于您从未指定itsTenure指向的位置,因此可能位于任何位置并且行为未定义(访问违规行为,例如您最有可能获得的结果)。
答案 4 :(得分:1)
您需要在构造函数中为* tenure分配内存:
Agents::Agents()
{
cout << "Constructor called \n";
itsTenure = new int;
*itsTenure = 0;
}