我可以得到指向 nullptr 的指针的指针吗,它是否有效
Can I get a pointer to a pointer pointing to nullptr, is it valid
我对以下代码有一些疑问:
void b(int** a){
int *c = new int;
*a = c;
**a = 120;
}
int main(){
int *a = nullptr;
b(&a);
if(a)
delete a;
return 0;
}
我担心的是这可能会导致 UB,因为它是一个 nullptr,并且我在获得对它的引用时正在更改指针地址,但后来我开始认为这不应该是一个问题,因为我会有。某些地址 ->空。这个地址是有效的,所以我可以更改它。
我不止一次运行了这个测试,并且启用了 -fsanitize=地址,它工作正常。但是,这是对的吗?
我担心的是这可能会导致 UB,因为它是一个空
b()
的参数a
不是nullptr
,它会在取消引用之前分配指向的指针,所以这不是一个问题。
我不认为你有内存泄漏,但你必须非常小心这样的事情:
#include <iostream>
void b(int** a)
{
int *c = new int;
*a = c;
**a = 120;
// if C is deleted then the *a needs to be set to nullptr
//delete c;
//*a = nullptr;
// Not needed as this will just be defeferenced off the stack
// *a and c are two different pointers in memory so this is fine
c = nullptr;
}
int main(){
int *a = nullptr;
std::cout << "Before B, a=" << a << std::endl;
b(&a);
std::cout << "After B, a=" << a << std::endl;
std::cout << "After B, *a=" << *a << std::endl;
if(a)
{
delete a;
}
// a still has a pointer with an address and can't be trusted
std::cout << "End A, a=" << a << std::endl;
// On repl.it, it prints 0
std::cout << "End *a, a=" << *a << std::endl;
return 0;
}
相关文章:
- 新分配指向函数的指针是否合法?
- 在函数结束后使用指向变量的指针是否安全?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 经过最后一个数组元素末尾的指针是否应该等于超过整个数组末尾的指针?
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 'this'指针是否可以在 c++ 标头声明中使用?
- C++ 在向量中使用指针是否可能导致指针悬空?
- 唯一指针是否在堆或堆栈上分配内存?
- 将基本实例指针强制转换为派生实例指针是否合法?(实例不是派生实例)
- 当向量增长时,指向向量元素的C++指针是否无效
- 如何判断指针是否是指向数组的指针
- 在类方法中使用 "this" 指针是否是一种好的做法?
- 如何知道指针是否已在其他地方释放
- 结构成员指针是否自动初始化为零?
- 为静态类创建指向对象的指针是否合法?
- 新的自动关键字指针是否会自行删除?
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 检查指针是否指向矢量元素
- 如何创建一个带锁的指针数组并检查指针是否空闲?
- 在映射中插入更多元素后,指向 QMap 中元素的指针是否仍然有效?