如果指针尚未分配内存,是否可以创建一个在指针上运行的 C++ "zap" 函数?
Can I create a C++ "zap" function that works on a pointer if it hasn't had memory allocated to it?
我编写了一个zap()函数,用于如下释放一个一维数组。
void zap(double *(&data))
{
if (data != NULL)
{
delete [] data;
data = NULL;
}
return;
}
我的印象是if data != NULL
不会试图释放从未分配过的内存,但我认为我错了。我遇到以下执行问题。
void fun()
{
int condition = 0;
double *xvec;
double *yvec;
allocate_memory_using_new(yvec); //a function that allocates memory
if (condition == 1) allocate_memory_using_new(xvec);
//some code
//deallocate memory:
zap (yvec);
zap (xvec); //doesn't work
return;
}
输出如下:
Unhandled exception at 0x6b9e57aa (msvcr100d.dll) in IRASC.exe: 0xC0000005: Access
violation reading location 0xccccccc0.
所以我意识到,当指针显然从未被实际使用时,尝试调用zap是不可取的。我只是想知道是否有一种方法可以检查zap()函数中某个点的指针地址,以避免出现异常。提前感谢您的帮助和洞察力!
指针不会神奇地初始化为0,只有当它们是全局或静态的时您需要这样做:
double *xvec = NULL;
double *yvec = NULL;
如果不这样做,它们包含随机垃圾,这些垃圾留在创建它们的堆栈上。而且这种垃圾在大多数情况下是而不是NULL
。
此外,您不需要对照NULL
进行检查,因为在这种情况下delete
是无操作的:
double* xvec = NULL;
delete xvec; // perfectly valid
此外,如果您使用的是Visual Studio 2010,我建议您使用nullptr
而不是NULL
。
xvec和yvec的值指向随机数,而不是NULL。我认为您的allocate_memory函数工作不正常,因为它通常会返回一个指向内存块的指针,您会将其分配给xvec和yvec
在C++中,指针不会像在其他语言(比如Java)中那样自动初始化为NULL,因此xvec
(指针)的值是未定义的,在测试时可能是NULL,也可能不是NULL。
void fun()
{
double *xvec; // value of xvec undefined, might be 0 or not
// ...
zap (xvec); // if it is not 0, you will try to delete: Undefined Behavior
}
简单的解决方案是初始化定义double *xvec = 0;
中的指针。此外,您不需要在zap
函数中测试NULL(或0
),如果在空指针上调用delete
,则不会导致未定义的行为:
template <typename T>
inline void zap( T *& p ) {
delete p;
p = 0;
}
我已经得出结论,new
和delete
的数组形式符合C++反模式的条件——它们看起来很合理,但实际上几乎所有对它们的使用都基本上保证会导致比可用代码更多的悲伤和问题。
因此,我想说,试图修复你的zap
有点像发现一个刚刚在火灾中,身体至少85%被3rd度烧伤的女人,并试图通过修剪她在逃离火灾时折断的指甲来让她变得更好。
- 函数向量_指针有不同的原型,我可以构建一个吗
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 引用一个已擦除类型(void*)的指针
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将指针从一个void函数传递到另一个C++
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 不明白迭代器,引用和指针失效,一个例子
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 将指针分配给另一个指针时会发生什么情况?
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++将一个指针分配给另一个指针时执行的类型检查
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 取消引用结束指针到数组类型的一个
- 更改一个指针后更改乘法对象
- const和指针(一个节点示例)
- 从函数返回指针.一个指针的值未更新