正确释放内存的问题
issues with freeing memory properly
嗨,我试图为这个字符指针释放内存,但因为它被初始化为名称,我不能删除/释放它。我该如何处理这种情况?我的头文件和实现文件如下所示:
/// Header file.
#ifndef __DAY_H__
#define __DAY_H__
class day {
private:
char* name;
int nClasses;
bool status; //working day or a holiday
public:
day();
day( char * name, int place, bool status);
day( const day& );
//operator=( const day& );
~day();
char * getName () const;
int getClasses () const;
bool getStatus () const;
void setName ( char * name );
void setClasses ( int classes );
void setStatus ( bool status );
};
#endif
/// .cpp file
#include <iostream>
#include "day.hpp"
#include <string.h>
day::day()
{
name = new char[10];
name = "Monday";
nClasses = 1;
status = true;
}
day::day(char * _name, int _classes, bool _status)
{
name = new char[10];
strncpy(name, _name, 10);
nClasses = _classes;
status = _status;
}
day::day(const day& _myday)
{
name = new char[10];
name = _myday.name;
nClasses = _myday.nClasses;
status = _myday.status;
}
char*
day::getName() const
{
return name;
}
int
day::getClasses() const
{
return nClasses;
}
bool
day::getStatus() const
{
return status;
}
void
day::setName( char * _name )
{
name = _name;
}
void
day::setClasses( int _classes )
{
nClasses = _classes;
}
void
day::setStatus( bool _status )
{
status = _status;
}
day::~day()
{
if (name != 0 ) {
std::cout << "Deleting name" << std::endl;
delete name;
}
}
如果这不是一个家庭作业,停在这里,用std::string
代替char*
,你的问题就解决了。
(另外你可以删除你的析构函数和复制构造函数,编译器生成的就足够了)
如果这是一个手动内存管理的练习,那么您需要修复几个方面。
你在两个地方有这种模式:
char *var = new char[N];
var = something_else;
这是内存泄漏。new
给你的指针在第二个语句中被其他东西取代。你没有另一个指针指向新分配的块,所以它已经泄漏了。
此外,默认构造函数中的第二个赋值形式为:
var = "string literal";
不允许删除字符串字面值,它具有程序的生命周期。因此,您最终会遇到这样的情况:您泄漏了内存和,您无法在析构函数中判断是否必须删除。
要解决这个问题,你必须做一个分配(如果必要的话),然后从你得到的任何来源复制。这样做还有一个好处,就是不存储直接传递给您的指针,如果调用者决定自己释放它,就会导致其他错误。因此,即使源是字符串字面值:
var = new char[N];
strncpy(var, source, N);
var[N-1] = 0; // check the docs for strncpy very carefully
一旦你解决了这个问题,你就需要遵守规则三,你真的需要一个复制赋值操作符。并且需要正确处理self-assignment
那么你也必须修复析构函数。用new[]
分配name
。必须使用delete[]
进行deallocate。这两者是相辅相成的。(name != 0
的测试是没有必要的,delete
和delete[]
处理null很好-即他们不做任何当递给一个空指针)。
这也是学习std::shared_ptr
和std::unique_ptr
的好时机。在大多数情况下,应避免使用普通的new
和delete
。
相关文章:
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 包含矢量指针的结构的内存释放问题
- 在函数中分配内存时出现问题
- C++ 结构内部的unordered_map会导致内存泄漏问题吗?
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- 释放内存(主题模板)时出现问题
- C++ 中 std::vector 的内存问题
- C++ DLL 堆内存分配问题
- 在我的以下代码中获取 MLE(内存限制错误).尝试解决 ROUND C 2019(问题 A-摆动行走)启动问题
- 字符 * 未从重载运算符或内存管理问题正确返回
- delete[]有问题,如何部分删除内存
- 内存泄漏问题
- 指向动态内存中结构中的变量时出现问题
- c++中的内存管理问题
- C++堆栈内存管理问题
- 为什么我的C 代码在Linux上运行,而在Windows上不运行,是否有RAM内存的问题
- JNA 参数问题:内存访问无效
- boost的问题::内存映射~500MB,外部USB文件