C++ 使用c+中的向量进行释放+; std::vector*temp=新的std::vector; 临时->推回(“a”);

C++ 使用c+中的向量进行释放+; std::vector*temp=新的std::vector; 临时->推回(“a”);,c++,C++,是否需要使用delete temp释放内存?或者内存解除分配由vector负责?std::vector包含一个内部数组。当向量被销毁时,该数组将自动删除 但是,如果将指针分配给向量,则需要显式删除它。一般来说,只需使用向量本身,而不是指向它的指针 如果我们编写自己的类,就可以看到这种行为。这个类包含一些数据,当数据被销毁时,它会打印一条消息 std::vector<char>*temp = new std:: vector<char>; temp->push_bac

是否需要使用delete temp释放内存?或者内存解除分配由vector负责?

std::vector
包含一个内部数组。当向量被销毁时,该数组将自动删除

但是,如果将指针分配给向量,则需要显式删除它。一般来说,只需使用向量本身,而不是指向它的指针

如果我们编写自己的类,就可以看到这种行为。这个类包含一些数据,当数据被销毁时,它会打印一条消息

std::vector<char>*temp = new std:: vector<char>;
temp->push_back('a');
带指针:

void withoutPointer() {
    MyClass c(10);
    std::cout << "Created MyClass\n"; 
}
这是因为析构函数被调用,所以数据被删除。另一方面,如果使用指针运行,它将打印:

void withPointer() {
    MyClass* ptr  = new MyClass(10); 
    std::cout << "Create MyClass*\n"
    std::cout u<< "Exiting function\n"; 
}
Creating MyClass
Deleting data

指针从未被删除,因此数据从未被销毁

vector的关键在于它在内部为您分配内存,并将您与所有需要担心的内存管理隔离开来—您只需像这样使用它

std::vector<char>*temp = new std:: vector<char>;
temp->push_back('a');
Create MyClass*
Exiting function
std::向量温度;
温度推回(“a”);

然后,当
temp
超出范围时,存储在
temp
中的所有内存将自动删除。

为什么要在第一位使用指向
std::vector
的指针?是的,您需要注意解除分配。规则是,使用
new
分配的任何内容,您都有责任在以后使用
delete
取消分配。由于您正在通过
new
分配
temp
,因此在使用完后还需要
删除它。vector类为您处理的是在vector中保存的项的分配/解除分配(例如,您的
a
字符);它不管理自己的分配/解除分配。通常,应该静态分配
std::vector
本身。向量的底层元素是动态分配的,并且由 STD::vector < /COD>管理。几乎从来没有一个实例需要动态分配一个向量,或者任何其他C++容器。你应该把它包装在一个智能指针中,
std::unique\u ptr
std::shared\u ptr
,这样你就不必担心手动分配它了。谢谢大家帮助我。使用new操作符将在堆上分配内存,这就是我使用heap的原因。如果向量是本地函数,那么向量的内容也存储在堆上吗?向量拥有的数据(向量的所有元素)存储在堆上。不过,作为向量的局部变量存在于堆栈上。存在于堆栈上的部分只有32字节大,因此将其放在堆栈上没有问题;将其放在堆栈上会更快。如果可以的话,尝试在堆栈上声明变量。谢谢大家的帮助。使用new操作符会在堆上分配内存,这就是我使用heap的原因。如果向量是本地函数,那么向量的内容也存储在堆上吗?@Wheel60是的,向量的内容总是存储在堆上。
sizeof(vector)
通常对应于3个指针(即64位机器上总共24字节),对应于分配内存的开始和结束以及实际使用内存的结束。
std::vector<char> temp;
temp.push_back('a');