我是VS C++中的C++新手.我正在创建win32 dll库.尝试finally块我有一个重大的基本问题.
让我假装我有这样的事情:
class object {
private:
int* foo;
public:
object() : foo(new int()) { *foo = 42; }
~object() {
// Now since foo is dynamically allocated, the destructor
// needs to deallocate it
delete foo;
}
};
int main() {
vector<object*> tmp;
tmp.push_back(new object());
// Do some stuff with tmp
for (int i = 0; i < tmp.size(); ++i) {
delete tmp[i]; // Calls ~object (which deallocates tmp[i]->foo)
// and deallocates *tmp[i]
}
tmp.clear();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我已经复制了代码片段: 另一个stackoverflow问题
在上面的例子中,我如何使用"free"部分,以便在方法完成其工作时可以随时释放它?我觉得最后尝试应该就够了.
但现在我可以看到有几个:尝试,__try不知道有什么区别.使用__try我得到编译器错误,其中有关于RAII的内容......
任何人都可以帮我这个吗?
它的资源获取是初始化,简称RAII.有这样的想法,如果一个对象拥有一个资源,它的析构函数应该自动释放它.在所有这些情况下,使用C++ 11,您需要使用std::unique_ptr而不是原始指针.所以,例如:
class object {
std::unique_ptr<int> foo;
public:
object() : foo(std::make_unique<int>(42)) { }
// no destructor necessary here
};
int main() {
std::vector<std::unique_ptr<object>> tmp;
tmp.push_back(std::make_unique<object>());
// when tmp goes out of scope, each object in it will already
// be deleted for you, no code necessary
}
Run Code Online (Sandbox Code Playgroud)
这里的许多优点之一是,现在您不必担心编写复制构造函数object(原样,如果复制它,您foo将获得delete两次).另见零度规则