C++指针值错误
C++ pointer wrong value
对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构造函数中参数的地址。这是悬空指针和未定义行为的直接原因。
如果你想学习如何使用指针,你需要读一本关于它的书。如果你只是需要使用类似指针的语义,那么就使用智能指针。
我很确定你的编译器给了你一些警告。在构造函数中,获取四个初始值设定项参数x
、y
、z
和w
的地址。这是允许的,但仅用于在构造函数本身内部使用地址。因为当构造函数完成后,这些变量就不再有效了,因此,指向它们的指针指向一个无效的内存地址(你不知道那里有什么了)。
你有两个选择:
- 不要使用指针;在这门课上你不需要它们。复制指针所需的工作量与复制双精度所需的工作一样多
- 自己管理你的指针。在构造函数中创建四个
new double
,并更改它们的值。查找refreneces
可能也不错
我知道您正在尝试了解指针,但对于这种应用程序,指针实际上是不必要的。只会让事情变得更慢。(虽然不多)。
- 这里没有setQ的实现
- 您正在尝试传递值,并在中获取值的地址四元数(双x、双y、双z、双w)
当你试图通过四元数中的值(双x,双y,双z,双w)时,你会得到值的地址。退出后,四元数(双x,双y,双z,双w)地址被占用,这些变量被清除,您使用的不是内存。
相关文章:
- 删除指向指针的指针是运行时错误吗
- c++中的指针和运行时错误
- 运行几次后合并段错误C++(指针算术)
- LinkedList实现C 错误指针间接
- 虚幻引擎 4.18.0,VS2017,不允许指向不完整类类型的错误指针
- Xcode 错误:指针和双精度之间的比较
- 未分配正在释放的本机node.js插件错误指针
- 错误指针:解析令牌时无法计算表达式
- C++-va_list错误指针
- 为什么我收到错误" (指针的名称)不是模板)?
- mmap 错误:分段错误/指针无效错误
- C++ Winsock2 错误指针断点触发
- C++ 代码中的错误指针错误
- 数组错误指针上的增量运算符
- MAKEINTRESOURCE 返回资源 ID 的错误指针
- 分段错误C++指针
- 段错误指针
- C++ 错误 :: 指针数组的EXC_BAD_ACCESS
- 通过模糊 mat 从 std::vector: <int>cv::Exception 中获取错误指针
- 正在解决编译器错误:指针可能未初始化