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

时间:2016-02-21 00:25:45

标签: c++ pointers return delete-operator

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

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

     return *intPointer;
}

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

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

    delete intPointer;
 }

这一切都有效,但为了便于阅读和提高效率,我想知道是否有一行等价物。 (我并不是说只是把它们放在同一条线上。我的意思是一个简短的方法。)

另外:在上面的例子中,我在两个函数中使用了相同的指针变量,并且它可以工作。它们在内存中是否相同?添加如下内容:

delete intPointer; 

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

2 个答案:

答案 0 :(得分:4)

你可以这样做:

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();

在这种情况下,它会导致内存泄漏,因为您正在使用调用创建的intPointer覆盖new {/ 1}}。

或者你的意思是写:

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

在这种情况下会发生内存泄漏,因为getIntPointer名为new,而您"已丢失"该指针不保存返回值。

对于您调用的每个new,您应该只有一个对应的delete,或者是内存泄漏。由于上面的两个例子都没有提供,因为两个案例都会丢失从new返回的指针之一,这是不正确的。

一般来说,最好不要使用"原始指针",而是使用std::unique_ptr(如果你只想到指向"生活"在一个一次放置)或std::shared_ptr(如果您希望多个对象拥有指针的副本)。

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

答案 1 :(得分:0)

我可能错了,但我认为你正在寻找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咆哮着为什么智能指针好坏。

相关问题