C++容器行为

Rus*_*rse 6 c++ containers

我的问题很简单.当我使用STL容器时,它们是否复制了我存储的值(通过使用复制构造函数)?如果我给它们数组(char*)而不是字符串实例怎么办?他们的表现如何?是否保证信息将存储在堆而不是系统堆栈中?

谢谢你的回答.

Joh*_*ing 7

STL容器中的值按值存储.如果你有这样的矢量:

class BigObject
{
...
};

vector<BigObject> myObjs;
myObjs.push_back(obj1);
myObjs.push_back(obj2);
...
Run Code Online (Sandbox Code Playgroud)

矢量会让你在推对象的副本.另外,在向量的情况下,它可能使新副本后,当它重新分配底层的内存,所以记住这一点.

当你有一个指针向量时,情况也是如此vector<char*>- 但是这里的区别在于复制的值是指针,而不是它指向的字符串.所以如果你有:

vector<char*> myStrings;
char* str = new char[256];     // suppose str points to mem location 0x1234 here
sprintf(str, "Hello, buffer");
myStrings.push_back(str);
delete [] str;
Run Code Online (Sandbox Code Playgroud)

...向量将获得指针的副本.它得到的指针将具有相同的值(0×1234),因为你delete在指针推后,D中的指针,你的载体包含一个野指针,你的代码最终会崩溃(早于后,希望).

顺便说一下,如果不使用char*s,你可以避免使用字符串:

typedef vector<string> strings;
strings myStrings;
myStrings.push_back("Hello, buffer");
Run Code Online (Sandbox Code Playgroud)


Tho*_*mas 5

他们复制价值.大多数(所有?)容器都需要定义复制构造函数和赋值运算符.

如果给它们一个char*,它们会复制指针,而不是指向的值.因此,您有责任确保字符串本身在其仍在使用时不会被销毁,并在不再需要时被销毁.