gpt4 book ai didi

c++ - 在不指定名称的情况下声明堆栈变量并获取指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:54 25 4
gpt4 key购买 nike

众所周知,用new 定义一个堆变量得到指针而不指定名称:

Var *p = new Var("name", 1);

但是我必须稍后在程序中使用delete p 清除p 指向的变量。

我想声明一个堆栈变量,以便在函数退出后自动清除它,但我只想获取指针,以及以下内容:

Var v("name", 1);
Var *p = &v;

非常乏味,永远不会引用说明符 v

我可以声明一个堆栈类实例并在不指定其名称的情况下获取它的指针吗?

最佳答案

这里隐藏着两个问题。第一个是:

Var *p = new Var("name", 1);

But I have to clear the variable pointed to by p with delete p later on in the program.

I want to declare a stack variable so it is automatically cleared after function exits

所以在这里,你问的是如何分配内存而不必在事后显式清理它。解决方案是使用 std::unique_ptr :

std::unique_ptr<Var> p(new Var("name", 1));

瞧! unique_ptr 会自动清理自身,与原始指针相比几乎没有开销,并且它重载了 * 和 -> 运算符,因此您可以像使用原始指针一样使用它。如果您想了解更多信息,请搜索“C++11 智能指针”。

第二个问题是:

I only want to get the pointer, and the following:

Var v("name", 1);
Var *p = &v;

is quite tedious, and specifier v will never be referenced.

这里的重点是 Var *p = &v 是完全没有必要的。如果你有一个需要指针的函数,你可以当场使用&v:

void SomeFunc(const Var* p);
// ...
Var v("name", 1);
SomeFunc(&v);

在将 &v 传递给需要指针的函数之前,无需将它放在单独的变量中。

异常(exception)情况是函数采用引用 指针(或指向指针的指针):

void SomeFunc2(Var*& p);
void SomeFunc3(Var** p);

这些类型的函数在现代 C++ 中很少见,当您看到它们时,您应该非常仔细地阅读该函数的文档。通常情况下,这些函数会分配内存,而您必须使用其他函数显式释放它。

关于c++ - 在不指定名称的情况下声明堆栈变量并获取指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16930248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com