当前位置: 首页 > 知识库问答 >
问题:

避免`delete[]`接受隐式指针转换?

龚鸿羽
2023-03-14

我有一个具有指向指针的隐式转换运算符的类。释放该指针无效。当与delete[]运算符一起使用时,是否可以阻止向指针的转换?我想要一个编译时错误。对于free函数,我可以删除将类作为参数的重载。

void foobar(double*){}

struct A {
  // Please pretend I have a good reason for doing this.
  operator double*() const { return nullptr; }
};

void free(A&) = delete;

int main(){
  A a;
  
  // Just works TM
  foobar(a);

  // This compiles :(
  delete[] a;
  // This does not :)
  //free(a);
  return 0;
}

我认为需要一些聪明的东西来达到预期的效果。

隐式转换的一个用例:比如说实现了一个限定范围的数组。转换使成为几乎减少了alloc/dealloc对的替换。需要显式转换的模板和迭代器。否则,类C函数的调用站点保持不变。

共有1个答案

魏成济
2023-03-14

作为一种解决办法,在与delete[]运算符一起使用时,可以通过使转换不明确来防止向指针的转换。

然而,根据代码其余部分的情况,这可能会对所需用例造成不希望的歧义。

struct A {
  operator double*() const { return nullptr; }
  operator void*() const { return nullptr; }
};
 类似资料:
  • 本文向大家介绍Java中避免空指针异常的方法,包括了Java中避免空指针异常的方法的使用技巧和注意事项,需要的朋友参考一下 没人会喜欢空指针异常!有什么方法可以避免它们吗?或许吧。。 本文将讨论到以下几种技术 1.Optional类型(Java 8中新引入的) 2.Objects类(Java 7中原有的) Java 8中的Optional类 它是什么? 1.Java 8中新引入的类型 2.它是作为

  • 有没有可能编写这样的内容,并且避免检查元素是否为空,集合是否为空: 我找到了这样的东西http://winterbe.com/posts/2015/03/15/avid-null-check-in-/ 基本上,我想要实现的是避免层次结构中如果带有多个检查天气对象的语句为null或集合为空。我在上面的文章中读到,这是可能的,可选的“空检查在引擎盖下自动处理。” 如果已经有了一些解决方案,很抱歉复制,

  • 本文向大家介绍java 避免出现NullPointerException(空指针)的方法总结,包括了java 避免出现NullPointerException(空指针)的方法总结的使用技巧和注意事项,需要的朋友参考一下 java 避免出现NullPointerException(空指针)的方法总结 Java应用中抛出的空指针异常是解决空指针的最好方式,也是写出能顺利工作的健壮程序的关键。俗话说“预

  • 关于非静态成员函数,请参见 常量、volatile和ref限定成员函数 其中提到: 非静态成员函数可以不使用ref限定符,也可以使用左值ref限定符(标记 no ref-限定符:隐式对象参数具有引用cv限定X的左值类型,并且还允许绑定右值隐式对象参数 左值引用限定符:隐式对象参数具有引用cv限定X的左值类型 rvalue ref限定符:隐式对象参数的类型rvalue reference指向cv限定

  • 条款9: 避免隐藏标准形式的new 因为内部范围声明的名称会隐藏掉外部范围的相同的名称,所以对于分别在类的内部 和全局声明的两个相同名字的函数f来说,类的成员函数会隐藏掉全局函数: void f(); // 全局函数 class x { public: void f(); // 成员函数 }; x x; f(); // 调用 f x.f(); // 调用 x::f 这不会令人惊讶,也不会导致混淆,

  • 条款25: 避免对指针和数字类型重载 快速抢答:什么是“零”? 更明确地说,下面的代码会发生什么? void f(int x); void f(string *ps); f(0); // 调用f(int)还是f(string*)? 答案是,0是一个int——准确地说,一个字面上的整数常量——所以,“总是”f(int)被调用。这就是问题所在:因为不是所有的人总是希望它这样执行。这是c++世