使用结构作为指针定义变量
defining a variable using a struct as pointer
我想使用struct
来定义一个变量
使用struct将变量定义为pointer
还是no pointer
更好?
例如,它是我的结构:
struct mystruct {
//data members
double x, y, z;
}
我在下面的代码中使用它:
void main() {
mystruct s1; //form 1
mystruct * s2 = new mystruct; //form 2
//.....
}
哪个变量定义更适合使用?s1还是s2?
如果可以的话,最好使用对象,即不是指针。
-
使用对象比使用指针和从堆中分配内存更快。
-
使用对象的结果是代码行更少、更干净。
-
使用对象可以避免在不需要内存时需要释放内存的问题。
我个人尽量避免指针和动态分配内存。
- 指针总是要检查为null
- 动态内存可能导致内存泄漏
- 很容易意外地指定指针,而不是值s2=。。而*s2=
关于之前对此的讨论,请参阅指针坏吗?
除非您有特定的理由使用指针(例如,如果您正在创建该结构的一组实例并将指针存储在向量中),否则通常最好不要使用。
这有几个原因:
- 你必须记住删除指针指向的东西,否则你会导致内存泄漏
- 你必须先取消引用指针,然后才能使用它所指向的东西
- 如果你做了一些改变指针的事情(比如给它添加一个值,当你想给数据成员添加一个数值时),你会得到一个指向谁知道什么的指针
一般来说,我更喜欢在堆栈上使用对象,而不是指向对象的指针,如果没有其他原因的话,那就是为了让自己更容易,不必担心这些事情。
关于类与结构的注释(显然已删除),它们本质上是完全相同的。它们在语法上略有不同(例如,默认情况下,类的成员是私有的,而结构的成员是公共的),但据我所知,并没有真正的区别。此外,指针并不关心它指向的是什么样的东西;它本质上只是两个数字:内存中的一个位置,以及该位置的预期大小。
void main() { mystruct s1; //form 1 mystruct * s2 = new mystruct; //form 2 //..... }
哪个变量定义更适合使用?s1还是s2?
s1
。
在C++中,只有在必须时才使用指针和动态内存分配。如果你没有从这些功能中获得任何优势,那么你只剩下它们的缺点。
手动new
/delete
和智能指针(如std::unique_ptr
或std::shared_ptr
:)将面临的一些缺点
- 代码中的更多间接性
- 需要以某种形式进行
nullptr
健全性检查 - 代码中的详细程度更高
std::shared_ptr
:的特殊缺点
- 即使在不需要内部同步的情况下,也会在多线程代码中增加显著的同步开销
只有手动new
/delete
:才会面临一些缺点
- 很容易产生内存泄漏,因为内存必须手动释放
- 倾向于在代码中到处创建更多
nullptr
健全性检查的需求 - 容易通过意外的多次删除生成未定义的行为
- 通过在释放内存后访问内存,可以容易地生成未定义的行为
- 很难确保异常安全
一些参考文献:
-
如果您也使用
delete
来创建对象,则不需要使用new
同一范围内的对象;这样的对象应该是局部变量。来源:https://isocpp.org/wiki/faq/freestore-mgmt#new-java
-
始终使用标准智能指针和非拥有的原始指针。永远不要使用拥有的原始指针和删除,除非在极少数情况下实现自己的低级数据结构(即使这样很好地封装在类边界内)。
来源:http://herbsutter.com/elements-of-modern-c-style/
附言:void main
不是合法的C++。使其成为int main
。
- 用户定义函数中的指针和输入
- 使用"Task"函数指针队列定义作业管理器
- 通过函数指针定义类范围之外的方法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 为什么不能将字符指针定义为数组?
- 块作用域中的函数指针定义
- 从较小类型的指针定义的范围构造向量
- 函数指针定义中是否允许使用参数名称
- 是对范围的指针定义明确的比较
- 无法将指针定义为用户定义的类,但我可以直接实例化
- C++ GoogleTest 使用夹具 - 无法访问函数指针定义
- 是指针定义行为映射中 nullptr 的默认值
- 是否应始终为具有原始指针成员的类中的深层复制指针定义复制构造函数
- 在类模板外部为指针定义函数
- 如何使用函数指针定义多集
- 使用结构作为指针定义变量
- 使用非常量指针定义对常量数据的指针的引用有什么问题?
- 是否有办法为类的指针定义括号操作符?
- 为智能指针定义类型是不好的做法吗?
- 为什么函数指针定义适用于任意数量的'&'号或星号"*"?