c++检查指针是否有效
C++ check if pointer is valid?
我在c++中有有效指针的问题。我在不同的线程中使用一个对象,所以我不能只是将指针设置为NULL并返回。这是我正在尝试的:
int main()
{
char *ptr = new char[1024]; //assume PTR = 0x12345678
changePtr(ptr); //after calling this,
//ptr is not NULL here.
return 0;
}
void changePtr(char *ptr)
{
delete [] ptr; //ptr = 0x12345678
ptr = NULL; //ptr = NULL
}
我如何将ptr
更改为NULL两个功能?
修改changePtr的签名为:
void changePtr(char **ptr)
{
delete [] *ptr; //ptr = 0x12345678
*ptr = NULL; //ptr = NULL
}
并使用:
changePtr(&ptr);
在c++中,使用引用参数:
void changePtr(char *&ptr) {
delete [] ptr; //ptr = 0x12345678
ptr = NULL; //ptr = NULL
}
在C中,你需要传递指针到指针,这基本上是一样的,只是语法不那么漂亮。
不需要修改主叫号码。但是你必须在调用时给出一个可修改的变量作为参数,不能给出例如NULL
或nullptr
,就像你不能做&NULL
一样。
如果您真的想以如此复杂、容易出错的方式管理内存,那么传递调用者指针的引用,而不是副本:
void changePtr(char *&ptr)
// ^
使用智能指针要好得多;它们被设计成当目标被删除时很难让它们悬空:
int main()
{
std::unique_ptr<char[]> ptr(new char[1024]); //assume PTR = 0x12345678
changePtr(ptr); //after calling this,
//ptr is empty here.
return 0;
}
void changePtr(std::unique_ptr<char[]> & ptr)
{
ptr.reset();
}
虽然如果我想要一个动态数组,我会完全避免new
而使用std::vector
。
我看到了很多关于如何检查指针有效性的问题。其中很多问题都是关于Windows的。可能没有一种通用的方法来检查c++,但是对于Windows特定的解决方案,下面的方法似乎在我的系统上有效:
#include <windows.h>
#include <stdio.h>
int main(int argc, char **argv)
{
MEMORY_BASIC_INFORMATION lpBuffer;
int cActualBytes;
cActualBytes = VirtualQuery(&main, &lpBuffer, sizeof(lpBuffer)); // Can we get info about main?
if (!cActualBytes)
{
printf("Nope, you can't do that n");
return 2;
}
if (cActualBytes != sizeof(lpBuffer))
{
printf("Surprise! Expected %d bytes, got %dn", sizeof(lpBuffer), cActualBytes);
}
printf("Information for mainn");
printf("---------------------------n");
printf("C reports pointer %p, Virtual Alloc sees it as %pn",&main,lpBuffer.BaseAddress);
return 0;
}
相关文章:
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 检查由括号、方括号和大括号组成的一组方括号是否有效?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 模板签名解析为 void(void) 被 GCC 拒绝;这是否有效C++?
- 我如何知道作为参数的size_t在函数中是否有效?
- 是否可以在C++中获取 CHAR 的有效十六进制地址?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 模板变量是否允许在多个翻译单元中并有效合并?
- 错误:在尝试检测 std::cout 是否<< t 时,功能强制转换为数组类型;有效
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 此递归模板类型定义是否有效C++?
- 将 C 函数转换为 C++ 以检查数字是否有效
- 函数参数的名称与调用函数时使用的变量相同是否有效?
- 如何检查输入是否有效?
- 如何检查用户的输入是否有效以及我正在寻找的数字?
- 堆分配对于大型块中的分页是否更有效?
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- 如何检查isupper(cstr)是否有效?