C++ 为什么指针会神奇地变为空?

C++ 为什么指针会神奇地变为空?,c++,C++,我正在执行代码,C++指针神奇地变成null。 我已经尝试在代码中添加一些print语句来调试它 下面是我的主类中的一些代码: 这是运算符只有当您的uberphysics类是从基类继承加速指针数据成员的派生类时,才会发生这种情况,基类具有默认构造函数和其他初始化数据成员的非默认构造函数。如果是这种情况,当您尝试创建派生类的对象时,将调用基类的默认构造函数。若要重写此操作,请在定义派生类构造函数主体的花括号之前使用成员初始值设定项运算符…这听起来像是未定义的行为,我也会尽量避免使用new,除非你

我正在执行代码,C++指针神奇地变成null。 我已经尝试在代码中添加一些print语句来调试它

下面是我的主类中的一些代码:


这是运算符只有当您的uberphysics类是从基类继承加速指针数据成员的派生类时,才会发生这种情况,基类具有默认构造函数和其他初始化数据成员的非默认构造函数。如果是这种情况,当您尝试创建派生类的对象时,将调用基类的默认构造函数。若要重写此操作,请在定义派生类构造函数主体的花括号之前使用成员初始值设定项运算符…

这听起来像是未定义的行为,我也会尽量避免使用
new
,除非你绝对需要它。如果您需要堆分配,请查看
std::make#u unique
您来自C#还是Java背景?正如上面提到的,在C++中,你不必使用<代码>新< /Cord>来创建对象。也许您应该投资?@Garhydrocella堆分配用于动态上下文(想想HTTP请求、异步IO等),因为上下文生存期超出了编译器的知识范围,因此无法使用自动存储。其他上下文不需要堆分配,顺便说一句,堆分配非常昂贵,应该只使用自动存储。@GaryDrocella从java提交时,这是一个常见的错误。将
new
delete
视为一种低级的、仅限专家操作。你的程序不应该有这些。尽可能使用简单的值(例如
Vector3D-vec{0,1,0}
)。简单的值更容易考虑,因为它们是局部的,比如
int
float
。需要时通过引用传递,因为它们不能为null。使用<代码> STD::MaMaIONION/Obj>用于动态分配或<代码> STD::MaMaMySuffy。@ GyyDoCula C++没有垃圾回收器。如果您进行大量手动内存分配,则很难确保您不希望在不希望发生共享的地方共享对象、内存泄漏和双重释放。看看一些优秀的C++代码,看看C++是如何完成的。
Vector3D* netForce = new Vector3D(0, forceY, 0);
Vector3D* accel = netForce->scalarMultiply(1.0/(*mass));

Vector3D *position = new Vector3D(75,initialHeight,0);
Vector3D* velocity = new Vector3D(0,0,0);

cout << "Sending in acceleration: " << *accel << "\n";

UberPhysics* uber = new UberPhysics(position, velocity, accel);

cout << "Uber acceleration: " << uber->getAcceleration();
...
UberPhysics::UberPhysics(Vector3D* position, Vector3D* velocity, Vector3D* 
                         acceleration, Vector3D* jerk, Vector3D* hyperJerk) {
  cout << "Check Acceleration: " << acceleration << endl;

  this->position = position;
  this->velocity = velocity;
  this->acceleration = acceleration;
  this->jerk = jerk;
  this->hyperJerk = hyperJerk;
}
Vector3D* Vector3D::scalarMultiply(double c) {
  Vector3D* v = new Vector3D(this->x*c, this->y*c, this->z*c);
  return v;
}
friend ostream& operator<<(ostream &os, Vector3D& v) {
  os << "<" << v.getX() << ","  << v.getY() << "," << v.getZ() << ">";
  return os;
}