是否有一种单行方法来声明和初始化指针变量?

Is there a one line approach to declaring and initializing pointer variables?

当我需要创建一个指针变量时,我目前使用以下有效的方法:

int getIntPointer()
{
    int * intPointer = new int;
    *intPointer = 0;

     return *intPointer;
}

同样,当 return 从另一个函数中获取这样的指针时,我会在 main() 中使用类似这样的东西来使用它:

int main()
{
    int * intPointer = new int;
    *intPointer = getIntPointer();

    delete intPointer;
 }

这一切都有效,但为了可读性和效率,我想知道是否有一行等价物。 (我的意思不是将它们放在同一条线上。我的意思是一种简捷的方法。)

另外:在上面的这个例子中,我在两个函数中使用了相同的指针变量,并且它有效。它们在内存中是同一个指针吗?添加如下内容:

delete intPointer; 

在 return 语句之后立即没有使程序崩溃,但它甚至到达那里了吗?或者在不再需要时删除它在 main 中传递的迭代是安全的吗?

你可以这样做:

int *intPointer = new int(0); 

(或 new int(100);,如果您希望 intPointer 指向值 100)。

当然,您可以将其缩短为:

return new int(0);

假设您不需要对指针执行任何其他操作。

注意:

int * intPointer = new int;
*intPointer = getIntPointer();

不正确。你的意思是:

int * intPointer = new int;
intPointer = getIntPointer();

在这种情况下,这是内存泄漏,因为您正在用调用创建的覆盖 new 中的 intPointer

或者你的意思是写:

int * intPointer = new int;
*intPointer = *getIntPointer();

在这种情况下存在内存泄漏,因为 getIntPointer 调用了 new 而您 "lost" 通过不保存 return 值的指针。

对于你调用的每一个new,你应该恰好有一个对应的delete,否则就是内存泄漏。因为我上面的两个例子都没有提供,因为这两种情况都会丢失从 new 编辑的指针之一 return,这是不正确的。

一般来说,最好不要使用 "raw pointers",而是使用 std::unique_ptr(如果你一次只希望指向一个地方的 "live")或 std::shared_ptr(如果您希望多个对象具有指针的副本)。

编辑:我上面的回答假设 getIntPointer 实际上做了名称所描述的,而不是问题中的代码所做的,这是相当糟糕的设计:分配内存然后 return指向值。

我可能是错的,但我认为您正在使用 std::shared_ptr 及其辅助函数 std::make_shared

std::shared_ptr< int > intPointer = std::make_shared< int >( 42 );

这里不再重复智能指针的所有用例,我将简单地link to an answer that goes into more detail on the topic.

inb4 大谈智能指针的优劣。