使用结构作为指针定义变量

defining a variable using a struct as pointer

本文关键字:指针 定义 变量 结构      更新时间:2023-10-16

我想使用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?

如果可以的话,最好使用对象,即不是指针。

  1. 使用对象比使用指针和从堆中分配内存更快。

  2. 使用对象的结果是代码行更少、更干净。

  3. 使用对象可以避免在不需要内存时需要释放内存的问题。

我个人尽量避免指针和动态分配内存。

  1. 指针总是要检查为null
  2. 动态内存可能导致内存泄漏
  3. 很容易意外地指定指针,而不是值s2=。。而*s2=

关于之前对此的讨论,请参阅指针坏吗?

除非您有特定的理由使用指针(例如,如果您正在创建该结构的一组实例并将指针存储在向量中),否则通常最好不要使用。

这有几个原因:

  1. 你必须记住删除指针指向的东西,否则你会导致内存泄漏
  2. 你必须先取消引用指针,然后才能使用它所指向的东西
  3. 如果你做了一些改变指针的事情(比如给它添加一个值,当你想给数据成员添加一个数值时),你会得到一个指向谁知道什么的指针

一般来说,我更喜欢在堆栈上使用对象,而不是指向对象的指针,如果没有其他原因的话,那就是为了让自己更容易,不必担心这些事情。

关于类与结构的注释(显然已删除),它们本质上是完全相同的。它们在语法上略有不同(例如,默认情况下,类的成员是私有的,而结构的成员是公共的),但据我所知,并没有真正的区别。此外,指针并不关心它指向的是什么样的东西;它本质上只是两个数字:内存中的一个位置,以及该位置的预期大小。

  void main() {
    mystruct s1;                    //form 1
    mystruct  * s2 = new mystruct;  //form 2
    //.....
}

哪个变量定义更适合使用?s1还是s2?

s1

在C++中,只有在必须时才使用指针和动态内存分配。如果你没有从这些功能中获得任何优势,那么你只剩下它们的缺点。

手动new/delete智能指针(如std::unique_ptrstd::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