处理访问NULL指针

时间:2014-09-17 07:14:08

标签: c++ oop pointers nullpointerexception null

在我的课堂上,除其他外,我还有一个指针:

Class GSM
{
//...
private:
    char *Pin;
//...
}

我的构造函数将其初始化为:

GSM::GSM()
{
//...
    Pin = NULL; 
//...
}

现在,我想将默认值(" 1234")设置为我的PIN。我尝试了非常简单的方法:

bool GSM::setDefaultValue()
{
    lock();
    Pin = "0";
    for (uint8 i =0; i < 4; ++i)
    {
        Pin[i] = i+1;
    }
    unlock();
    return true;
}

但它没有用。当我运行我的程序(我使用Visual Studio 2010)时出现错误:

Access violation writing location 0x005011d8

我试图删除行

Pin = "0";

但它没有帮助。我必须在构造函数中将其初始化为NULL。它是一个更大的项目的一部分,但我认为,上面的代码是让我麻烦的原因。我在C ++ / OOP中仍然很新,有时我仍然会被指针弄糊涂。

我应该怎么做才能改进我的代码和我的想法? 编辑:根据要求,我必须补充说我不能使用std :: string。我是公司的实习生,项目很大(比如成千上万的文件),我在这里看不到任何标准,我也不允许使用它。

3 个答案:

答案 0 :(得分:4)

你需要给Pin一些记忆。像这样:

Pin = new char[5];  // To make space for terminating `\0`;
for(...)
{
   Pin[i] = '0' + i + 1;
}
Pin[4] = '\0';      // End of the string so we can use it as a string.

...

然后你应该在某个地方使用delete [] Pin;(通常在类的析构函数中,但是根据它的使用方式,它可能在别处需要,例如赋值运算符,你还需要写一个拷贝构造函数,参见Rule Of Three)。

在适当的C ++中,您应该使用std::string代替,然后您可以执行:

Class GSM
{
//...
private:
    std::string Pin;
....

Pin = "0000";
for (uint8 i =0; i < 4; ++i)
{
    Pin[i] += i+1;
}

使用std::string可以避免分配/解除分配内存的大部分问题,并且&#34;只是工作&#34;复制,分配或销毁类时 - 因为std::string实现和编译器为您完成了工作。

答案 1 :(得分:1)

您需要分配一块内存来存储“1234”。您的Pin指针将指向此内存块。 你可以尝试:

bool GSM::setDefaultValue()
{
    lock();
    Pin = new char[4];
    for (uint8 i =0; i < 4; ++i)
    {
        Pin[i] = '0' + (i + 1);
    }
    unlock();
    return true;
}

由于你已经为动态分配了一个内存块,所以当你不再需要它时,你应该总是释放它。为此,您应该在类中添加析构函数:

GSM::~GSM()
{
    delete [] Pin;
}

答案 2 :(得分:0)

简单回答:

而不是使用堆(new delete),只需在类中为四个字符的引脚分配空间:

Class GSM
{
//...
private:
    char Pin[5];
//...
}

长度固定为5(允许4个字符的空格并终止null'\0'),但只要您只需要存储最多4个字符,就可以了。

当然,如果您想在将来轻松改变:

Class GSM
{
//...
private:
    const int pin_length = 4;
    char Pin[pin_length+1];
//...
}

您设置值的功能将如下所示:

bool GSM::setDefaultValue()
{
    lock();
    for (char i = 0; i < pin_length; ++i)
    {
        Pin[i] = i+1;
    }
    Pin[pin_length]=0;
    unlock();
    return true;
}

甚至:

bool GSM::setDefaultValue()
{
    lock();
    strcpy(Pin,"1234");  //though you would have to change this if the pin-length changes.
    unlock();
    return true;
}