当前位置:  开发笔记 > 编程语言 > 正文

这两个班级有什么区别?

如何解决《这两个班级有什么区别?》经验,为你挑选了1个好方法。

下面,我没有宣称my_ints是指针.我不知道将分配内存的位置.请教我这里!

#include 
#include 

class FieldStorage
{
private:
    std::vector my_ints;

public:
    FieldStorage()
    {
        my_ints.push_back(1);
        my_ints.push_back(2);
    }

    void displayAll()
    {
        for (int i = 0; i < my_ints.size(); i++)
        {
            std::cout << my_ints[i] << std::endl;
        }
    }
};

在这里,我将该字段声明my_ints为指针:

#include 
#include 

class FieldStorage
{
private:
    std::vector *my_ints;

public:
    FieldStorage()
    {
        my_ints = new std::vector();
        my_ints->push_back(1);
        my_ints->push_back(2);
    }

    void displayAll()
    {
        for (int i = 0; i < my_ints->size(); i++)
        {
            std::cout << (*my_ints)[i] << std::endl;
        }
    }

    ~FieldStorage()
    {
        delete my_ints;
    }
};

main() 功能测试:

int main()
{
    FieldStorage obj;
    obj.displayAll();
    return 0;
}

它们都产生相同的结果.有什么不同?



1> Eric Melski..:

在内存管理方面,这两个类几乎完全相同.其他几个响应者已经建议两者之间存在差异,因为一个是在堆栈上分配存储而另一个在堆上,但这不一定是真的,即使在它是真的情况下,它也是非常误导的.实际上,所有不同的是分配元数据的地方vector; vector无论如何,都是从堆中分配的实际底层存储.

看到这个因为你正在使用它有点棘手std::vector,所以隐藏了具体的实现细节.但基本上,这样std::vector实现:

template 
class vector {
public:
    vector() : mCapacity(0), mSize(0), mData(0) { }
    ~vector() { if (mData) delete[] mData; }
    ...
protected:
    int mCapacity;
    int mSize;
    T *mData;
};

如您所见,vector类本身只有几个成员 - 容量,大小和指向动态分配的内存块的指针,该内存块将存储向量的实际内容.

在您的示例中,唯一的区别是这些少数字段的存储来自何处.在第一个示例中,存储是从您用于包含类的任何存储中分配的 - 如果它是堆分配的,那么也将是那些位vector.如果你的容器是堆栈分配的,那么那些位也是如此vector.

在第二个例子中,这些位vector总是堆分配的.

在这两个例子,实际的vector-它的内容-从堆中分配的,你不能改变的.

其他人已经指出你的第二个例子中有内存泄漏,这也是事实.确保删除容器类的析构函数中的向量.

推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有