是否有一种单行方法来声明和初始化指针变量?
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 大谈智能指针的优劣。
当我需要创建一个指针变量时,我目前使用以下有效的方法:
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 大谈智能指针的优劣。