C++ 使用c+中的向量进行释放+; std::vector*temp=新的std::vector; 临时->推回(“a”);
是否需要使用delete temp释放内存?或者内存解除分配由vector负责?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
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');