c++ - 这两个类有什么区别?

标签 c++ memory

下面,我my_ints 声明为指针。我不知道内存将被分配到哪里。请在这里教育我!

#include <iostream>
#include <vector>

class FieldStorage
{
private:
    std::vector<int> 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 <iostream>
#include <vector>

class FieldStorage
{
private:
    std::vector<int> *my_ints;

public:
    FieldStorage()
    {
        my_ints = new std::vector<int>();
        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;
}

它们都产生相同的结果。有什么区别?

最佳答案

在内存管理方面,这两个类实际上是相同的。其他几个响应者建议两者之间存在差异,一个是在堆栈上分配存储空间,另一个是在堆上分配存储空间,但这不一定是正确的,即使在正确的情况下,它也会产生极大的误导。实际上,唯一不同的是 vectormetadata 分配位置; vector 中的实际底层存储无论如何都是从堆中分配的。

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

template <class T>
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 的那些位始终是堆分配的。

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

其他人已经指出您在第二个示例中存在内存泄漏,这也是事实。确保在容器类的析构函数中删除 vector 。

关于c++ - 这两个类有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/682434/

相关文章:

c - 总线错误: 10 when scanning address space in c

C 内存缓冲区破坏微 Controller 内存分配 - Atmel ATxmega

linux - 嵌入式系统 : Where's my memory?

c++ - 所有可用的 swig+python+mingw 编译信息都过时了吗?

c++ - 从流中提取到 char 数组或 std::string 的最安全方法

c++ - codecvt 不是标准头吗?

c - 内存分配查找

c++ - 为什么这个变量在 C++14 中的 g++ 中没有被推断为 initializer_list?

c++ - 混合程序(asm+cpp): sending and receiving an array pointer

c - brk() 、 sbrk() 和 realloc() 函数之间的区别