【问题标题】:Confused with dynamic memory allocation C++ [duplicate]对动态内存分配 C++ 感到困惑 [重复]
【发布时间】:2019-11-25 00:35:09
【问题描述】:

我对动态内存分配有点困惑,我希望有人能帮我解决这个问题。

假设我们有一个程序:

int length = 0;

cout << "Enter the size of the array" << endl;
cin >> length;
cin.ignore();

int numbers[length];

这不还是动态内存分配吗 因为数组大小是在运行时定义的 用户输入指定长度后?

vs 使用:

int numQuestions = 0;

cout << "How many questions would you like to add?" << endl;
cin >> numQuestions;
cin.ignore();

Question *newQuestions = new Question[numQuestions];

【问题讨论】:

  • 第一个示例不是标准 C++,它没有可变长度数组,因此您的问题没有实际意义。您正在使用编译器扩展。
  • 具有运行时限制的数组在 n3639 中被提议到 C++14 中,但被否决了,因此可能需要一些时间才能有人重新提出该提议。
  • @ÖöTiib - 我怀疑它会复活。 VLA 在 C99 中是可选的,并于 2011 年正式从 C 标准中删除 - 原因是基于评估的 C 中的缺点。这削弱了基于 C 兼容性的任何理由。此外,C 的 VLA 的大部分缺点也适用于 C++。该功能也不能很好地与 C++ 对象模型(构造函数、析构函数等)配合使用,并且 C++ 还提供了替代方案(如标准容器),这些替代方案被认为优于在 C++ 中使用任何原始数组构造。

标签: c++ pointers dynamic-memory-allocation


【解决方案1】:

有什么区别?动态内存是在堆上分配的,而数组是在栈上分配的。因为int numbers[length] 的内存是在堆栈上分配的,所以它不被视为动态内存分配。 更重要的是,您不能返回指向以这种方式分配的数组的指针,因为该数组是一个局部变量,在函数退出时会被销毁。

这就是动态分配的目的——动态分配允许内存在你需要的时候一直存在,直到在指向内存的指针上调用 delete 时它才会消失。

另外,应该注意的是,声明一个在运行时确定大小的数组是非标准 C++,某些编译器将其作为扩展支持。

那么最佳做法是什么? 使用原始指针是旧的做事方式。这很容易出错,因为您可能忘记删除内存,或者如果出现异常,删除内存的代码可能会被绕过。这会导致内存泄漏。

如果您改用std::vector,您将获得以下好处:

  • 您可以在运行时确定大小,
  • 您可以从函数返回vector,
  • vector分配的内存自动被删除,所以不会出现内存泄漏。

如何使用std::vector?

这很简单!只需替换

int numbers[length];

与

std::vector<int> numbers(length);

【讨论】:

  • 漂亮!正是我需要的,谢谢。
猜你喜欢
  • 2013-12-25
  • 2021-11-16
  • 1970-01-01
  • 2020-08-21
  • 2013-07-10
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
相关资源
最近更新 更多