下面,我没有宣称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; }
它们都产生相同的结果.有什么不同?
在内存管理方面,这两个类几乎完全相同.其他几个响应者已经建议两者之间存在差异,因为一个是在堆栈上分配存储而另一个在堆上,但这不一定是真的,即使在它是真的情况下,它也是非常误导的.实际上,所有不同的是分配元数据的地方vector
; vector
无论如何,都是从堆中分配的实际底层存储.
看到这个因为你正在使用它有点棘手std::vector
,所以隐藏了具体的实现细节.但基本上,这样std::vector
实现:
templateclass 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
-它的内容-从堆中分配的,你不能改变的.
其他人已经指出你的第二个例子中有内存泄漏,这也是事实.确保删除容器类的析构函数中的向量.