在这种情况下我是否必须删除内存?

时间:2017-08-21 10:27:04

标签: c++ dynamic struct

这是一个使用动态内存的简单程序。

我的问题是我是否必须删除内存,或者结构将为我处理它?

#include <iostream>
struct Student {
  int grade;
  char *name;
};

void print(Student name);
int main() {
  Student one;
  one.grade = 34;
  one.name = new char[12];
  int i;
  for (i = 0; i < 11; ++i) {
    one.name[i] = 'a' + i;
  }
  one.name[i] = '\0';
  print(one);

  delete[] one.name;
  return 0;
}
void print(Student name) {
  std::cout << name.name << " has a score of " << name.grade << "\n";
}

6 个答案:

答案 0 :(得分:5)

有一个简单的经验法则 - 对于new的每次调用,您应该有一次删除调用。在这种情况下,您应该删除one.name,如:delete [] one.name

当然,在你不再需要它的价值后,你应该这样做。在这种情况下,这是在返回之前。

答案 1 :(得分:1)

使用dynamicallynew时,必须释放使用mallocdelete分配的free内存,否则您将使用Memory leak 39;得到delete

  • 区分delete[]one.name = new char[12]; // an array of 12 elements in the heap delete[] one.name; // freeing up memory char* c = new char('C'); // a single char in the heap delete c; :第一个没有下标运算符用于删除为指针分配的new动态内存。后者用于删除动态分配的数组。

  • 所以在你的情况下:

    new, delete
  • 不要将malloc, free与{{1}}混合:

这是未定义的行为,因为没有办法可靠地证明指针后面的内存是正确分配的(即new用于delete或new []用于delete [])。确保这样的事情不会发生,这是你的工作。使用正确的工具,即智能指针,这很简单。无论何时说删除,你都做错了。

答案 2 :(得分:0)

如果您不想使用唯一/共享指针,可以使用构造函数进行分配,使用析构函数自动释放内存。

答案 3 :(得分:0)

如果结构中的原始指针是观察指针,则不必删除内存(当然,代码中的某个位置必须释放内存)。

但是,如果原始指针是拥有指针,则必须释放它。

通常,每次调用new[]都必须与delete[]进行匹配调用,否则会泄漏内存。

在您的代码中,您调用了new[],因此您必须调用delete[]才能正确释放内存。

在C ++中,您可以避免容易出错的漏洞原始指针,并使用智能指针或容器类(例如std::vectorstd::string等)代替

答案 4 :(得分:0)

创建结构并不意味着它将在C ++中处理垃圾收集  没有垃圾收集,因此对于您使用 new 分配的每个内存,您应该使用delete关键字来释放空间。如果您在JAVA中编写代码,则不必删除,因为垃圾收集器将自动删除未使用的引用。

答案 5 :(得分:-2)

实际上,该结构不会释放或删除您创建的内存。如果您想要释放空间,您可以按照以下方式进行。

xcopy