我有一个(显然)很简单的类初始化,有两个构造函数,当我想创建一个新的友谊时,第一个参数的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
答案 0 :(得分:3)
Friendship::Friendship(const User &u1, const User &u2)
{
*user1 = u1;
*user2 = u2;
}
由于user1
和user2
未初始化,因此您无法取消引用它们。我想你的意思是:
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
是指针。希望它有所帮助:)。