gpt4 book ai didi

c++ - 如何使用户无法删除动态数组?

转载 作者:太空狗 更新时间:2023-10-29 23:31:13 25 4
gpt4 key购买 nike

在撰写回复时,我编写了一些代码来挑战我对 const 指针如何工作的假设。我假设 const 指针不能被 delete 函数删除,但正如您将从下面的代码中看到的那样,情况并非如此:

#include <new>
#include <string.h>

class TestA
{
private:
char *Array;
public:
TestA(){Array = NULL; Array = new (std::nothrow) char[20]; if(Array != NULL){ strcpy(Array,"Input data"); } }
~TestA(){if(Array != NULL){ delete [] Array;} }

char * const GetArray(){ return Array; }
};

int main()
{
TestA Temp;
printf("%s\n",Temp.GetArray());
Temp.GetArray()[0] = ' '; //You can still modify the chars in the array, user has access
Temp.GetArray()[1] = ' ';
printf("%s\n",Temp.GetArray());
//Temp.GetArray() = NULL //This doesn't work

delete [] Temp.GetArray(); //This works?! How do I prevent this?
}

我的问题是,我如何将指针的访问权限传递给用户(以便他们可以像使用 char 数组一样使用它),同时使删除函数无法删除它,最好是抛出某种投诉或异常?

最佳答案

如果您的用户在他们不是从 new[] 获得的指针上使用 delete[],请用线索棒打他们的头。

指针可以取消引用但不能传递给 delete 的原因有很多:

  • 其他人会删除它。
  • 这不是 block 的开始。
  • 它来自 malloc 或其他一些非 new 分配器。
  • 它有静态的,而不是动态的生命周期。
  • 如果有自动生命周期。

其中一些会在运行时出现异常。其他人会在以后的某个时间导致崩溃。根据标准,所有这些都是“未定义的行为”。

假设应该是指针不能用作 delete 的参数,除非另有明确说明。

如果入门级程序员犯了这个错误,请教育他们。如果“有经验”的开发人员正在这样做,请解雇他们,因为他们在简历上撒谎。


如果您只是希望在他们这样做时受到伤害,请分配比必要的大一个数组,然后 return Array + 1;。现在,如果他们尝试使用 delete[],一切都会崩溃。

实际用途是(更有可能)使程序在虚假的 delete 调用中崩溃,而有问题的函数仍在调用堆栈中。原来的地方可能会继续运行一段时间,最后崩溃无辜的代码。所以这可以帮助您捕获愚蠢的用户。

关于c++ - 如何使用户无法删除动态数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7716074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com