C ++指针错误的值

时间:2015-11-12 14:41:40

标签: c++ pointers c++11

相对较新的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;
}

当我创建一个Quaternion对象并设置字段时,尝试通过释放指针来打印其中一个变量,例如X.我没有得到我期待的结果。

int main()
{

Quaternion q1(4, 9, 2, 5);

double*d = q1.getX();

cout << d << endl;
cout << *d << endl;
}

示例输出 -

00B1FB5C
6.26381e+148

我哪里错了?

4 个答案:

答案 0 :(得分:2)

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

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

如果您想学习如何使用指针,您需要阅读一本关于它的书。如果您只需要使用类似指针的语义,请使用智能指针。

答案 1 :(得分:1)

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

您有两种选择:

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

我知道你正在尝试学习指针,但是对于这个应用程序,指针实际上并不是必需的。只会让事情变得更慢。 (虽然不多)。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

当您尝试在Quaternion中传递值(double x,double y,double z,double w)时,您将获得值的地址。退出Quaternion(双x,双y,双z,双w)地址后,这些变量被清除掉了,你使用的不是你的记忆。