这个指针在C++中突然变成0x0
This pointer suddenly becomes 0x0 in C++
我有一个(显然(非常简单的类初始化,有两个构造函数,当我想创建一个新的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;
}
由于user1
和user2
尚未初始化,因此还不能取消引用它们。我想你的意思是:
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
是指针。希望它无论如何都有帮助:(。
- MPI突然停止了对多个核心的操作
- 调用函数时,变量突然无缘无故地更改
- DirectX 11 引擎在第三次代码改进后没有突然运行,我不知道为什么
- 瓦尔格林德错误 - 地址0x0不是堆叠的 malloc'd 或自由的
- 链接时突然收到maxrregcount警告和未定义的引用错误
- 线程 1:xcode 中出现EXC_BAD_ACCESS(代码 = 1,地址 = 0x0)错误
- c++ Valgrind:地址0x0不是堆叠的、恶意的或(最近)释放的
- Xcode:线程1:exc_bad_access(代码= 1,地址= 0x0)在缩短列表时
- 当存在空单元格时,用于 c++ 的 Tsv 文件解析器会突然结束
- 使用指针的法律遗留代码突然变成了 UB
- 线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x0)错误
- 我的矢量突然停止有什么问题?
- 例外:使用 C++ EXC_BAD_INSTRUCTION(代码 = EXC_I386_INVOP,子代码 = 0x0)
- 程序收到信号sigsegv,分段故障.在al_draw_tinted_bitmap中(bitmap = 0x0,tint
- GTK图像突然不会刷新任何错误或警告
- C 程序在CIN之后突然结束
- 如何检查指针指向的地址是否0x0?
- EOF突然到达ifstream中的getline()
- C I2C芯片读取MCP9800突然开始失败
- 这个指针在C++中突然变成0x0