繁体   English   中英

在这种情况下是否需要删除内存?

[英]Do I have to delete memory in this case?

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

我的问题是我是否必须删除和上的内存,否则该结构将为我处理它?

#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";
}

有一条简单的经验法则:每次调用new您都应该删除一次。 在这种情况下,您应该像这样删除one.name:delete delete [] one.name

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

使用deletefree完成使用newmalloc dynamically分配的malloc必须释放它,否则会出现Memory leak

  • 区分deletedelete[] :第一个不带下标的运算符用于删除为new分配的指针动态内存。 后者用于删除动态分配的数组。

  • 因此,在您的情况下:

     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, delete使用malloc, free new, delete malloc, free

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

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

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

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

通常,对new[]每次调用都必须具有对delete[]匹配调用,否则会浪费内存。

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

在C ++中,您可以避免容易出错的易于泄漏的原始指针,而改用智能指针或容器类(例如std::vectorstd::string等)。

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

实际上,该结构不会释放或删除您已创建的内存。 如果要释放空间,可以执行以下操作。

#include <iostream>
using namespace std;
int main()
{
    char *c = new char[12];
    delete[] c;
    return(0);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM