C++ Destructors with Vectors, Pointers,
据我所知,我应该在析构函数中销毁我用
std::vector 和std::string s:它们是自动销毁的吗?如果我有类似的东西
1std::vector<myClass*>指向类的指针。调用向量析构函数时会发生什么?它会自动调用
myClass 的析构函数吗?或者只有向量被销毁,但它所包含的所有对象仍然存在于内存中?如果我在一个类中有一个指向另一个类的指针,会发生什么情况,比如:
1
2
3class A {
ClassB* B;
}A类在代码中的某一点被销毁。类B也将被销毁,或者只是指针和类B仍将存在于内存中的某个地方?
std::vector and std::strings: Are they destroyed automatically?
是(假设成员变量不是指向
If I have something like std::vector what happens when the vector destructor is called?
Would it call automatically the destructor of myClass? Or only the vector is destroyed but all the Objects it contains are still existant in the memory?
如果
What happens if I have a pointer to another class inside a class
您只需要担心动态创建的内存(当您使用
例如:
1 2 3 4 5 6 | Class Myclass{ private: char* ptr; public: ~Myclass() {delete[] ptr;}; } |
这要看情况而定。
例如。
1 2 3 4 5 | { std::vector<std::string> a; std::string b; MyClass c; } //at this point, first c will be destroyed, then b, then all strings in a, then a. |
如果您到达指针,您会正确猜测:只有指针本身所占用的内存(通常是4字节整数)在离开作用域时才会自动释放。除非您显式地使用cx1(4),否则所指向的内存不会发生任何变化(无论它是否在向量中)。如果有一个类包含指向其他对象的指针,则可能需要在析构函数中删除它们(取决于该类是否拥有这些对象)。请注意,在C++ 11中有指针类(称为智能指针),它们可以以类似的方式处理指针到"正常"对象:
前任:
1 2 3 4 | { std::unique_ptr<std::string> a = make_unique<std::string>("Hello World"); function_that_wants_string_ptr(a.get()); } //here a will call delete on it's internal string ptr and then be destroyed |
如果它们在自动存储中,是的。您可以使用
std::string* s = new std::string ,在这种情况下,您必须自己删除它。不需要,您需要手动删除您拥有的内存(对于与
new 一起分配的内存)。如果您将
B 分配给new ,您应该在析构函数中明确地销毁它。
一个好的经验法则是对代码中的每个
更好的经验法则是使用RAII,使用智能指针而不是原始指针。
是的。当他们
在
(2)相同的。这将是在M和B类的指针,而不是尖的。你提供的是一
在C + +的解决方案有一个11
en.cppreference.com http:/ / / / / / w的)独特的_ CPP存储器
据我所知,所有其他STL容器都有自动销毁器。这就是为什么使用这些容器而不是
只有当向量是
在第一种情况下,
您指向的
If I have something like std::vector what happens when the vector destructor is called?
这要看情况而定。
如果有一个值为
如果你有一个指针向量
What happens if I have a pointer to another class inside a class
我的理解是,这工作应该如下:
1 2 3 4 5 | vector <int> test_vector = {1,2,3,4,5,6,7} // Call vector constructor ... Any manipulations with a vector ... test_vector.~vector(); // Call vector destructor |
那是你想要的吗?