【问题标题】:Are there any tools to warn possible misusage of delete or delete []?是否有任何工具可以警告可能误用 delete 或 delete []?
【发布时间】:2023-04-02 13:58:01
【问题描述】:

我想我很清楚 delete 和 delete [] 之间的区别。我在这里要问的问题是:有时我确实有错字并使用了错误的。然后它可能会崩溃,也可能不会崩溃,通常会花费数小时的调试时间。

我希望 gcc 能够在一些最简单的情况下检测并警告可能的误用。 由于需要调用遗留函数,我仍然需要不时使用“new float[size]”,所以我更感兴趣的是找到一个错误检查工具来捕捉这些错误的一部分。

【问题讨论】:

  • 您不需要使用new float[size]。使用std:array<float>std::vector<float>
  • 一个工具:不要使用new[]。有vector(几乎在任何情况下)。
  • 在可执行文件上使用 valgrind
  • 另外,您也不需要使用new。使用std::make_shared
  • 感谢所有宝贵的建议。 Valgrind 对我来说太慢了(程序可能会运行数小时才能在优化模式下找到有问题的代码,然后使用调试模式的 valgrind 将它放几天……通常慢 100 倍——而不是慢 10 倍!)我会避免新的 [ ] 建议。

标签: c++ vector delete-operator scalar


【解决方案1】:

您可以将浮点数放入std::vector<float>,然后将front()&front() 传递给这些遗留函数。我不确定这是否能保证按标准工作,但它应该可以在常见的实现中工作。

如果你有 C++11 库支持并且在编译时知道size,那么std::array<float, size> 会更高效。

【讨论】:

  • 当大小在编译时已知时,new 无论如何都不是一个选项。
【解决方案2】:

我希望 gcc 能够在一些最简单的情况下检测到可能的误用并发出警告。

使用valgrind

我仍然需要不时使用new float[size],因为我需要调用遗留函数

不,你没有。如果遗留函数需要一个指向浮点数组的第一个元素的指针,请执行以下操作:

std::vector<float> numbers(10);
legacy_func(&numbers[0]);

不要这样做:

float *numbers = new float[10];
legacy_func(numbers);
delete[] numbers;

【讨论】:

  • 如果您有现代编译器,请改用numbers.data()
  • 我喜欢 numbers.data()。 1-2 年后,我不得不将它们改回 &numbers[0]。有时他们希望使用旧编译器构建代码...
猜你喜欢
  • 2012-08-03
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2014-09-02
  • 2017-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多