c++ - 如何使用析构函数删除在类构造函数中分配的动态内存
问题描述
我正在尝试使用析构函数释放对象的内存。该内存是在对象声明时分配的。下面的代码片段是我正在制作的程序的综合版本,但它解释了我的问题。我知道问题是通过析构函数释放的,但我不知道异常的原因可能是什么。
#include <iostream>
using namespace std;
class student
{
private:
char const* firstname;
char const* lastname;
public:
student()
{
firstname = new char[10];
lastname = new char[10];
firstname = "HelloMaria";
lastname = "Something";
}
void print()
{
cout << "Firstname = " << firstname<<endl;
cout << "Last name = " << lastname << endl;
}
~student()
{
cout << "Destructor Called" << endl;
delete[] firstname;
delete[] lastname;
}
};
int main()
{
student obj1;
obj1.print();
system("pause");
return 0;
}
解决方案
您的问题出在以下几行:
firstname = new char[10];
lastname = new char[10];
firstname = "HelloMaria";
lastname = "SomethingVe";
首先你设置firstname
和lastname
指向新分配的char
数组,这很好......但是你立即将它们更改为指向静态分配的字符串。这意味着当您delete[]
在析构函数中传递指向的指针时,您正在尝试删除从未分配过的字符串,这会调用未定义的行为。
处理字符串的正确方法是使用std::string
而不是分配您自己的字符缓冲区,但如果由于某种原因您不能这样做,那么执行您尝试做的事情的下一个最佳方法将更像这样:
student()
{
firstname = alloc_string_buffer("HelloMaria");
lastname = alloc_string_buffer("SomethingVe");
}
private:
// Helper function to allocate the right-sized char-buffer and
// copy the bytes from the passed-in literal string into the buffer
char * alloc_string_buffer(const char * s)
{
size_t numBytesToAllocate = strlen(s)+1; // +1 for the NUL terminator byte
char * buf = new char[numBytesToAllocate];
strcpy(buf, s);
return buf;
}
推荐阅读
- python - 评估在做什么?
- python - TypeError: Decimal('0.00') 在石墨烯突变对象响应上不是 JSON 可序列化的
- excel - 具有不同系统设置的正确格式的当前 UTC 时间
- ruby-on-rails - 更改 LinkedIn 登录 API 的权限
- c# - 如何从“详细信息”中删除一行。(大师详细)?
- flask - 如何在烧瓶舞上发送带有 json 数据的发布请求?
- javascript - 在 Jest 中使用 beforeEach 函数有什么好处
- android - 如何将 android.view.View 依赖项添加到外部模块?
- jquery - 自动完成 request.term 以根据使用的输入字段进行更改
- postman - 停止在预请求脚本中运行的测试,但不停止整个测试运行