如何在运行时设置指向Null的指针(C ++)

时间:2010-10-19 06:00:54

标签: c++ pointers null

现在我的指针设置为2D数组中的一行。我希望该指针停止指向该行,但我稍后将使用指针进行其他操作。我只是想知道如何在指针初始化之后取消设置并指向一行。

double* tempRow;
tempRow = (double*) malloc(size * sizeof(double));
   ...
tempRow = NULL;

不会将tempRow变量与数组行取消链接。为什么不呢?

我想知道我是否应该使用C代替。使用矢量时会有开销吗?

5 个答案:

答案 0 :(得分:11)

虽然你已写入将tempRow设置为NULL,但它不会释放你已分配的内存。为此你需要

free(tempRow);
tempRow = NULL;

但是,如果您使用C ++作为标记建议,那么最好使用C ++ new / delete

double* tempRow;
tempRow = new double[size];
   ...
delete [] tempRow;
tempRow = NULL;

您甚至可以使用STL为您处理内存分配。

std::vector<double> tempRow(size);
// You can access the data, in a similar way to an array
tempRow[5] = tempRow[4]+tempRow[3];

// If you really need to access the underlying pointer, (To pass to another 
// function for example) you can do this. Note that the pointer will be valid
// until the vector is destroyed or modified in certain ways that can cause the
// vector to reallocate its memory. So you can't use this to pass data to a 
// function that destroys or takes ownership of the passed in pointer.

fn_requiring_pointer( &temp[0] );

// The memory used in tempRow will get cleaned up automatically when the 
// object goes out of scope
//
// If I really need to free up the memory used in it early I can use a swap 
// hack. (iirc tempRow.clear() isn't guaranteed to release the memory)
std::vector<double>().swap(tempRow); // Unneeded in most cases.

也可能不需要尝试将tempRow指针重用于不相关的东西。只需创建一个具有不同名称的新指针。重复使用变量形式可能会使代码很难在以后理解。

答案 1 :(得分:6)

我也是C ++的新手,但不久之前,有人告诉我使用std::vector是处理数据数组的一种更安全的方法。

  • 添加更多元素时自动重新分配。
  • #include <algorithm>中的内容一起使用的迭代器。
  • 使用.at(index)元素访问权限保护边界。
  • 不需要乱码指针跟踪。
  • 使用operator[]进行C阵列样式访问。
  • RAII。

你会声明一个这样的矢量:

std::vector<double> tempRow(size);

tempRow[0] = 3.00;
tempRow[1] = 1.00;

// no need to use delete[] or free(), it will destruct itself
// and relinquish its resources automatically.

答案 2 :(得分:4)

  

似乎不起作用?

这是最糟糕的投诉和解决方案提供商的噩梦。

你的意思是你得到编译错误吗?

如果是,您是否包含<cstdio>?using namespace std;

答案 3 :(得分:4)

您展示的示例应该可以使用。
如果如果您在制作temRow NULL之前没有释放内存,那么 泄漏 记忆。

double* tempRow;
tempRow = (double*) malloc(size * sizeof(double));
   ...
free(tempRow);  // free the memory.
tempRow = NULL; // reset the pointer.
   ...
tempRow = &some_other_double_var; // reuse the pointer.

答案 4 :(得分:2)

以什么方式不起作用?在C ++中“取消设置”指针的常规方法是:

tempRow = 0;

但你所拥有的应该没问题,假设你已经包含了正确的标题或者NULL具有正确的定义。

顺便说一句,在丢失指针之前,你应首先在该内存上调用free(),否则你会有内存泄漏(这假设你有充分的理由使用C风格{{1而不是更犹太的C ++ malloc/free)。