动态内存分配和使用类

时间:2014-08-10 17:52:41

标签: c++ class dynamic-memory-allocation

我正在尝试实现一个GradeManager类,它在内部使用一个使用new运算符动态创建的DataVector对象数组,来记录一组学生的作业成绩。

我正在努力制作构造函数/析构函数。

构造函数的描述:"这是该类的唯一构造函数,它指定了nStudents的学生数和该类的homeworks 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;
    }

};

2 个答案:

答案 0 :(得分:0)

一些想法:

  1. 如同quantdev的评论中所述,请使用std :: vector&lt;&gt;在DataVector类中 - 比使用数组简单得多,但你不能直接限制它的大小(就像使用数组几乎自动完成一样)。
  2. 看起来您可能在DataVector :: Reserve()中发生内存泄漏和可能的分段错误。你为new_data分配了新的内存,将数据从m_data复制到new_data(这让我想到了一个想法;如果m_size大于newSize会发生什么?IMO,内存访问错误,但我不确定),然后将m_data重新指向new_data,而不释放先前调用中存储在m_data中的数据(例如,在构造函数中)。这将导致内存泄漏。
  3. 另外,我不完全确定DataVector :: Reserve()方法是否保留任何空间,如果是这样的话 这是什么意思。
  4. 此外,构造函数/析构函数 - 在我看来,至少 - 对于GradeManager看起来很好,大多数问题实际上都在DataVector类中。

    祝你好运!

答案 1 :(得分:0)

我假设您不允许使用标准容器,例如std :: vector&lt;&gt;或者std :: array&lt;&gt;这可以促进这项工作。

您的DataVector构造函数和析构函数是一致的:您创建一个新的动态数组并删除动态数组。

但是在inbetween中,您可以在GradeMaster构造函数中调用函数Reserve()。 它的for循环可以超出范围,因为新大小可以比旧大小更大或更小。你必须检查我是否仍然在源和目标的范围内:

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行。