c++ - 与动态内存分配 C++ 混淆

标签 c++ pointers dynamic-memory-allocation

<分区>

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

假设我们有一个程序:

int length = 0;

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

int numbers[length];

Wouldn't this still be dynamic memory allocation since the array size is being defined at runtime after the user enters in the specified length?

与使用:

int numQuestions = 0;

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

Question *newQuestions = new Question[numQuestions];

最佳答案

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

这就是动态分配的目的 - 动态分配允许内存在您需要时一直存在,并且在对内存指针调用 delete 之前它不会消失。

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

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

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

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

如何使用 std::vector

非常简单!只需更换

int numbers[length];

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

关于c++ - 与动态内存分配 C++ 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59023821/

相关文章:

c++ - 计算具有多个检查点的网格中的路径

c++ - 为什么 C 字 rune 字是整数而不是字符?

c++ - 在 C++ 中计算两个 vector 的标量积

c++ - 如何为 C++ 的不同变量类型的结构元素创建动态数组?

c - 无法正确释放另一个 malloc 的 malloc

c++ - 在 OpenGL 中快速绘制许多相同的对象

c - C中的链表程序挂了

c++ - 在 C++ 中优化指针拷贝

c - 使用一个struct来发音多个变量,报错

c - 导致 SIGTRAP 的自由函数