C++指针值错误

C++ pointer wrong value

本文关键字:错误 指针 C++      更新时间:2023-10-16

对C++来说相对较新,我正在尝试使用动态内存进行学习。在这种情况下,我使用它来存储成员变量。

Quanternion.h-

#ifndef QUATERNION_H_
#define QUATERNION_H_
class Quaternion
{
private:
double* x = new double();
double* y = new double();
double* z = new double();
double* w = new double();
public:
Quaternion(double x, double y, double z, double w);
Quaternion(const Quaternion& q);
Quaternion& operator=(const Quaternion& q);
~Quaternion();
void setQ(double *_x, double *_y, double *_z, double *_w);
double * getX() { return x; }
double * getY() { return y; }
double * getz() { return z; }
double * getw() { return w; }
};
#endif

Quanternion.cpp-

#include "Quaternion.h"
Quaternion::Quaternion(double x, double y, double z, double w)
{
    double*a = &x;
    double*b = &y;
    double*c = &z;
    double*d = &w;
    setQ(a,b,c,d);
}
Quaternion::Quaternion(const Quaternion & q)
{
    this->x = q.x;
    this->y = q.y;
    this->z = q.z;
    this->w = q.w;
}
Quaternion & Quaternion::operator=(const Quaternion & q)
{
    if (this == &q)
    {
        return *this;
    }
    this->x = q.x;
    this->y = q.y;
    this->z = q.z;
    this->w = q.w;
    return *this;
}
Quaternion::~Quaternion()
{
}
void Quaternion::setQ(double *_x, double *_y, double *_z, double *_w)
{
    this->x = _x;
    this->y = _y;
    this->z = _z;
    this->w = _w;
}

当我创建一个四元数对象并设置字段,并尝试通过取消分配指针来打印其中一个变量(如X)时。我没有得到我期望的结果。

int main()
{
Quaternion q1(4, 9, 2, 5);
double*d = q1.getX();
cout << d << endl;
cout << *d << endl;
}

示例输出-

00B1FB5C
6.26381e+148

我哪里错了?

您的代码违反了管理原始指针的基本原则——您不知道谁拥有这些指针。同一指针可能是通过new分配的实体,或者只是构造函数中提供的地址。这使得拥有这些不可能——你不能编写赋值运算符或复制构造函数(你当前的实现是错误的)。

更直接的问题是,您正在记住4-doubles构造函数中参数的地址。这是悬空指针和未定义行为的直接原因。

如果你想学习如何使用指针,你需要读一本关于它的书。如果你只是需要使用类似指针的语义,那么就使用智能指针。

我很确定你的编译器给了你一些警告。在构造函数中,获取四个初始值设定项参数xyzw的地址。这是允许的,但仅用于在构造函数本身内部使用地址。因为当构造函数完成后,这些变量就不再有效了,因此,指向它们的指针指向一个无效的内存地址(你不知道那里有什么了)。

你有两个选择:

  • 不要使用指针;在这门课上你不需要它们。复制指针所需的工作量与复制双精度所需的工作一样多
  • 自己管理你的指针。在构造函数中创建四个new double,并更改它们的值。查找refreneces可能也不错

我知道您正在尝试了解指针,但对于这种应用程序,指针实际上是不必要的。只会让事情变得更慢。(虽然不多)。

  1. 这里没有setQ的实现
  2. 您正在尝试传递值,并在中获取值的地址四元数(双x、双y、双z、双w)

当你试图通过四元数中的值(双x,双y,双z,双w)时,你会得到值的地址。退出后,四元数(双x,双y,双z,双w)地址被占用,这些变量被清除,您使用的不是内存。