动态内存分配和使用类
Dynamic Memory Allocation and using Classes
我正在尝试实现一个GradeManager类,它在内部使用使用new操作符动态创建的DataVector对象数组来记录一组学生的家庭作业成绩。
我正在努力创建构造函数/析构函数。
构造函数的描述:"这是该类的唯一构造函数,它指定该类的学生数量nStudents和作业数量nhw。您应该使用这些来动态设置数组大小。"
你的任何想法都将大有帮助!这是我目前得到的。非常感谢!!
#include <iostream>
#include <cmath>
#include <iomanip>
//DO NOT INCLUDE ANYTHING ELSE!!
using namespace std;
typedef double DataType;//Alias for double type
typedef unsigned int UIntType;//Alias for unsigned int type
class DataVector
{
private:
DataType *m_data; //Pointer to dynamically allocated memory that holds all items
UIntType m_size; //Size of the m_data array
public:
DataVector()
{
m_data = new DataType[10];
for(int i = 0; i < 10; i++){
m_data[i]=0;
}
m_size = 10;
}
DataVector(UIntType initSize, DataType initValue)
{
int arraySize = initSize;
m_data = new DataType[arraySize];
for(int i = 0; i < arraySize; i++){
m_data[i] = initValue;
}
m_size = initSize;
}
~DataVector()
{
delete [] m_data;
m_data = NULL;
}
UIntType GetSize()
{
return m_size;
}
void Reserve(UIntType newSize)
{
int arraySize = newSize;
DataType *new_data;
new_data = new DataType[arraySize];
for(int i = 0; i < m_size; i++){
new_data[i] = m_data[i];}
m_data = new_data;
m_size = newSize;
}
};
class GradeManager
{
private:
DataVector *m_student;//m_student[0], m_student[1], etc correspond to sID 0, 1, etc respectively
UIntType m_nStudents;//Number of students
public:
GradeManager(UIntType nStudents, UIntType nHWs)
{
m_student = new DataVector[nStudents];
m_student->Reserve(nHWs);
m_nStudents = nStudents;
}
~GradeManager()
{
int numOfStudents = m_nStudents;
for(int i = 0; i < numOfStudents; i++)
delete [] m_student;
m_student = NULL;
}
};
一些想法:
- 就像quantdev在评论中所说的,在DataVector类中使用std::vector<>——比使用数组简单得多,尽管你不能直接限制它的大小(就像数组几乎自动完成的那样)。
- 似乎你可能有一个内存泄漏和可能的分段故障在DataVector::Reserve()。你为new_data分配新的内存,将数据从m_data复制到new_data(这让人想起一个想法;如果m_size大于newSize会发生什么?IMO,内存访问错误,但我不确定),然后将m_data重新指向new_data,而不释放先前调用中存储在m_data中的数据(例如,在构造函数中)。这将导致内存泄漏。
- 此外,我不完全确定方法DataVector::Reserve()保留任何空间,如果是
另外,至少在我看来,GradeManager的构造函数/析构函数看起来很好,大多数问题实际上位于DataVector类中。
祝你好运!
我假设您不允许使用标准容器,例如std::vector<>或std::array<>,它们可以方便地完成这项工作。
你的DataVector构造函数和析构函数是一致的:你创建一个新的动态数组,你删除动态数组。
然而,在两者之间,有一个函数Reserve()
,你在GradeMaster构造函数中调用。它的for
环可以越界,因为新的大小可以比旧的大或小。您必须检查i是否保持在源和目标的边界内:
for (int i = 0; i < m_size && i<arraySize; i++){ // check on source and target bounds !!!
还会由于不释放不再需要的旧对象而造成内存泄漏。你必须在循环结束后插入这一行:
delete[] m_data; // insert this to avoid memory leaks
最后一点是在GradeMaster析构函数中。当你用delete[]
删除整个数组时,你绝对不能循环并尝试删除数组几次!删除数组,将删除其所有元素。只需删除for行。
相关文章:
- Win32编译器选项和内存分配
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 当需要超过16GB的连续内存时,内存分配失败
- 尝试摆脱任何堆内存分配
- 以下代码执行哪种内存分配(动态或静态)?
- 开放 CV 中的动态内存分配,用于视频处理
- 为什么类和 main() 函数中也有动态内存分配
- 使用 NTAllocateVirtualMemory 和 GetProcAddress 的内存分配问题不起作用
- C++:矢量分配器行为、内存分配和智能指针
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- Linux C++ 中的页面对齐内存分配
- 整数内存分配/释放
- 将内存分配返回值强制转换为 TYPE 数组
- C++程序什么都不做,但瓦尔格林德显示内存分配
- 给定特定内存地址的数组的动态内存分配
- 如何完成内存分配
- 我刚刚了解了C++中的动态内存分配
- 在先前调用 string::find 后添加内存分配和内存集会导致它返回 npos.为什么?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 无法删除布尔动态内存分配