该指针在C ++中突然变为0x0

时间:2011-11-16 01:23:02

标签: c++ pointers constructor null

我有一个(显然)很简单的类初始化,有两个构造函数,当我想创建一个新的友谊时,第一个参数的this指针有适当的指针值,但第二个没有。

我会在代码中更好地解释 - 这是我的构造函数:

Friendship::Friendship(const User &u1, const User &u2){
    *user1 = u1;
    *user2 = u2;
}

当我在Test类中执行此操作时:

bool Test::insertFriendship(User *user1, User *user2) {
    bool friendshipExists = verifyFriendship(user1, user2);

    if(!friendshipExists) {
        friendships.push_back(new Friendship(*user1, *user2)); // this is a ptr_vector container
        return true;
    }
    return false;
}

它在push_back行给出了一个EXC_BAD_ACCESS错误,因为当它到达构造函数并且它指向一个有效的内存地址时,显然是user1的'this'指针,但当它转到user2时,''这个'user2的指针指向0x0并且它失败了,因为当它到达operator = overload时,它基本上试图重新引用NULL。

例如:当它试图建立一个新的友谊时:

this-> user1的mem地址= 0x100100b20 this-> user2的mem地址= 0x0 - 错误!

u1的mem地址= 0x7fff5fbff900 u2的mem地址= 0x7fff5fbff898

我的意思是,这些u1和u2内存地址是有效的,所以当我尝试这样做时,为什么它不起作用:

*user1 = u1; //works cos this is 0x100100b20
*user2 = u2; // fails cos this is 0x0 even though u2 is a valid mem address!

任何人都知道为什么这种奇怪的行为?即使我在push_back中切换user1和user2,它仍然无法在SECOND中工作。总是那个讨厌的第二个永远无法运作。

啊,这是我的友谊头文件,没什么太复杂的。

#include "User.h"

#ifndef Friendship_h
#define Friendship_h

class Friendship {
    friend class Test;
protected:
    User *user1;
    User *user2;

public:
    Friendship(const User &u1, const User &u2);
    Friendship(const Friendship &a);
    ~Friendship();
};

#endif

2 个答案:

答案 0 :(得分:3)

Friendship::Friendship(const User &u1, const User &u2)
{
    *user1 = u1;
    *user2 = u2;
}

由于user1user2未初始化,因此您无法取消引用它们。我想你的意思是:

Friendship::Friendship(const User &u1, const User &u2)
{
    user1 = &u1;
    user2 = &u2;
}

答案 1 :(得分:0)

这确实是一个奇怪的错误。但是,我建议先尝试一下。

而不是:

Friendship::Friendship(const User &u1, const User &u2)
{
    *user1 = u1;
    *user2 = u2; 
}

这样做:

Friendship::Friendship(const User *u1, const User *u2)
{
    user1 = u1;
    user2 = u2; 
}

和此:

bool Test::insertFriendship(User *user1, User *user2) {
    bool friendshipExists = verifyFriendship(user1, user2);

    if(!friendshipExists) {
        friendships.push_back(new Friendship(user1, user2)); // did not dereference user1 and user2, only gave the pointers.
        return true;
    }
    return false;
}

第一种形式不正确。我很惊讶它一直在运行; *user1 = u1应该制作u1的深层副本并将其放入user1。您应该将指针显式复制到user1:user1 = u1,其中u1是指针。希望它有所帮助:)。