动态内存分配和使用类

Dynamic Memory Allocation and using Classes

本文关键字:内存 分配 动态      更新时间:2023-10-16

我正在尝试实现一个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;
    }
};

一些想法:

  1. 就像quantdev在评论中所说的,在DataVector类中使用std::vector<>——比使用数组简单得多,尽管你不能直接限制它的大小(就像数组几乎自动完成的那样)。
  2. 似乎你可能有一个内存泄漏和可能的分段故障在DataVector::Reserve()。你为new_data分配新的内存,将数据从m_data复制到new_data(这让人想起一个想法;如果m_size大于newSize会发生什么?IMO,内存访问错误,但我不确定),然后将m_data重新指向new_data,而不释放先前调用中存储在m_data中的数据(例如,在构造函数中)。这将导致内存泄漏。
  3. 此外,我不完全确定方法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行。