我在使用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?
答案 0 :(得分:7)
将changePtr的签名更改为:
void changePtr(char **ptr)
{
delete [] *ptr; //ptr = 0x12345678
*ptr = NULL; //ptr = NULL
}
并使用以下方式调用它:
changePtr(&ptr);
答案 1 :(得分:6)
在C ++中,使用引用参数:
void changePtr(char *&ptr) {
delete [] ptr; //ptr = 0x12345678
ptr = NULL; //ptr = NULL
}
在C中,你需要将指针传递给指针,这基本上与不太漂亮的语法相同。
您无需更改主叫代码。但是你必须在调用时给出一个可修改的变量作为参数,不能给出例如NULL
或nullptr
,就像你不能做&NULL
一样。
答案 2 :(得分:3)
如果你真的想以这种复杂的,容易出错的方式管理内存,那么就传递一个引用,而不是调用者指针的副本:
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
。
答案 3 :(得分:0)
我已经看到很多关于如何检查指针的有效性的问题。关于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 %d\n", sizeof(lpBuffer), cActualBytes);
}
printf("Information for main\n");
printf("---------------------------\n");
printf("C reports pointer %p, Virtual Alloc sees it as %p\n",&main,lpBuffer.BaseAddress);
return 0;
}