使用struct作为指针定义变量

时间:2015-11-29 07:23:46

标签: c++ pointers struct

我想使用struct来定义变量 最好使用struct作为pointerno pointer

来定义变量

例如它是我的结构:

 struct mystruct {
    //data members
    double x, y, z; 
}

我在下面的代码中使用它:

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

哪个变量定义更好用? s1或s2?

4 个答案:

答案 0 :(得分:1)

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

  1. 指针总是必须检查为空
  2. 动态内存可能导致内存泄漏
  3. 容易意外分配指针,而不是值s2 = ..而不是* s2 =
  4. 有关此前的讨论,请参阅Are pointers bad?

答案 1 :(得分:1)

如果有效,使用对象(即不是指针)总是更好。

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

  2. 使用对象会产生更少,更清晰的代码行。

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

答案 2 :(得分:1)

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

这有几个原因:

  1. 您必须记住删除指针指向的东西,否则最终会导致内存泄漏。
  2. 在使用它指向的东西之前,你必须取消引用指针。
  3. 如果你做了一些改变指针的事情(比如给它添加一个值,当你打算向数据成员添加一个值时),你会得到一个指向谁知道什么的指针。
  4. 一般来说,我更喜欢在堆栈上使用对象而不是指向对象的指针,如果没有其他原因,不要因为不必担心这些事情而让自己更容易。

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

答案 3 :(得分:1)

  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完整性检查的必要性。
  • 容易因意外多次删除而产生未定义的行为。
  • 通过在释放内存后访问内存,轻松生成未定义的行为。
  • 很难做到例外安全。

一些参考文献:

P.S。:void main不是合法的C ++。设为int main