这个指针在C++中突然变成0x0

This pointer suddenly becomes 0x0 in C++

本文关键字:突然 0x0 C++ 指针      更新时间:2023-10-16

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

我将在代码中更好地解释——这是我的构造函数之一:

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)); // this is a ptr_vector container
        return true;
    }
    return false;
}

它在push_back行给了我一个EXC_BAD_ACCESS错误,因为很明显,当它到达构造函数时,user1的"this"指针工作,它指向有效的内存地址,但当它到达user2时,user2的"this"指针指向0x0,它失败了,因为当它到达operator=overload时,它基本上是试图重新尊重NULL。

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

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

u1的内存地址=0x7fff5fbff900u2的内存地址=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,它在第二个时仍然不起作用。总是那个讨厌的第二个永远不会起作用。

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

#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
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;
}

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

取而代之的是:

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是指针。希望它无论如何都有帮助:(。