当我需要创建指针变量时,我目前使用以下方法:
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中传递的迭代是否安全?
答案 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咆哮着为什么智能指针好坏。