在这种情况下,我必须删除内存吗?



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

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

#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] = '';
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 [] one.name

当然,您应该在不再需要其值后执行此操作。在这种情况下,这是在返回之前。

使用newmalloc分配dynamically的内存必须在使用deletefree完成处理后释放,否则您将Memory leak

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

  • 所以在你的情况下:

    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, deletemalloc, free混为一谈:

这是未定义的行为,因为无法可靠地证明指针后面的内存已正确分配(即由 new 表示删除或 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);
}

最新更新