-4
string *str=new string;

vector<string *> vector;

vector.push_back(str)

简而言之,我想知道指针向量何时超出范围,指针自身占用的空间是否被释放?

4

1 回答 1

4

您的问题有点不清楚,但我想,您希望动态分配字符串,但在向量超出范围后自动释放,对吧?

Vector 在销毁时只会销毁其内容。这意味着,当向量超出范围时,它将销毁其列表中保存的指针,但不会销毁这些指针指向的对象。所以可能会导致内存泄漏。

实际上,这个问题有几个解决方案。您可以存储 std::string 的实例而不是指向 std::strings 的指针:

std::vector<std::string> strings;
strings.push_back("Alice has a cat");

strings超出范围时,所有字符串都将被销毁。

另一种选择是使用名为 shared_ptr 或 unique_ptr 的 boost(如果您使用 C++ pre-11)或 std(如果您使用 C++11)类。它的行为更像是一个指针,但是当它超出范围时,它会破坏包含的对象。因此,如果您像这样声明您的列表:

std::vector<std::shared_ptr<std::string>> strings;
std::push_back(std::make_shared<std::string>("Alice has a cat"));

字符串将被动态分配,并自动释放(vector 将释放所有 shared_ptr,如果对持有的字符串的引用不超过这些指针,它们也将释放字符串)。

进一步阅读:

于 2013-05-09T09:24:20.310 回答