下面,我没有宣称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;
}
}
};
Run Code Online (Sandbox Code Playgroud)
在这里,我将该字段声明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;
}
};
Run Code Online (Sandbox Code Playgroud)
main() 功能测试:
int main()
{
FieldStorage obj;
obj.displayAll();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它们都产生相同的结果.有什么不同?
Eri*_*ski 12
在内存管理方面,这两个类几乎完全相同.其他几个响应者已经建议两者之间存在差异,因为一个是在堆栈上分配存储而另一个在堆上,但这不一定是真的,即使在它是真的情况下,它也是非常误导的.实际上,所有不同的是分配元数据的地方vector; 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;
};
Run Code Online (Sandbox Code Playgroud)
如您所见,vector类本身只有几个成员 - 容量,大小和指向动态分配的内存块的指针,该内存块将存储向量的实际内容.
在您的示例中,唯一的区别是这些少数字段的存储来自何处.在第一个示例中,存储是从您用于包含类的任何存储中分配的 - 如果它是堆分配的,那么也将是那些位vector.如果你的容器是堆栈分配的,那么那些位也是如此vector.
在第二个例子中,这些位vector总是堆分配的.
在这两个例子,实际的肉的vector-它的内容-从堆中分配的,你不能改变的.
其他人已经指出你的第二个例子中有内存泄漏,这也是事实.确保删除容器类的析构函数中的向量.
| 归档时间: |
|
| 查看次数: |
643 次 |
| 最近记录: |