这里隐藏着两个问题。第一个是:
Var *p = new Var("name", 1);
但我必须稍后用delete p清除p指向的变量
在程序中。
我想声明一个堆栈变量,以便它自动清除
函数退出后
因此,在这里,您要问如何分配内存,而无需事后显式清理它。解决方案是使用std::unique_ptr http://en.cppreference.com/w/cpp/memory/unique_ptr:
std::unique_ptr<Var> p(new Var("name", 1));
瞧! unique_ptr 会自动清理自身,与原始指针相比,它几乎没有任何开销,并且它重载了 * 和 -> 运算符,因此您可以像原始指针一样使用它。如果您想了解更多信息,请搜索“C++11 智能指针”。
第二个问题是:
我只想获取指针和以下内容:
Var v("name", 1);
Var *p = &v;
相当乏味,而且说明符 v 永远不会被引用。
这里重要的一点是Var *p = &v
完全没有必要。如果你有一个需要指针的函数,你可以使用&v
当场:
void SomeFunc(const Var* p);
// ...
Var v("name", 1);
SomeFunc(&v);
在将 &v 传递给需要指针的函数之前,无需将 &v 放入单独的变量中。
例外情况是如果该函数采用参考指向指针(或指向指针的指针):
void SomeFunc2(Var*& p);
void SomeFunc3(Var** p);
这些类型的函数在现代 C++ 中很少见,当您看到它们时,应该非常仔细地阅读该函数的文档。通常,这些函数会分配内存,您必须使用其他函数显式释放它。