【问题标题】:How to correct warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]如何纠正警告:从不同大小的整数转换为指针 [-Wint-to-pointer-cast]
【发布时间】:2015-06-04 10:03:39
【问题描述】:

我有一个带有缓冲区的类,该缓冲区稍后会通过读取文件来填充:

char* m_buffer;

...在类析构函数中我执行以下操作:

int i;
for(i=0; i < m_size; i++) {
  delete (char*)m_buffer[i];
}
delete m_buffer;

我在delete (char*)m_buffer[i] 收到编译器警告:

警告:从不同大小的整数转换为指针 [-Wint-to-pointer-cast]

我已经阅读了一些关于类似问题的其他问题,但我无法理解这些解决方案是如何应用的。

更新 并回答cmets
m_buffer初始化如下:

m_buffer = new char[m_size];

【问题讨论】:

  • m_buffer[i]charm_buffer 在析构函数中指向什么样的对象?另外,请考虑使用std::vector&lt;char&gt;
  • 是的,你应该删除一个指针,不要将字符转换为指针... char sizeof 是 1,指针可能是 4 或 8...
  • 假设您分配了内存ala m_buffer = new char[n];,您不需要delete 缓冲区中m_buffer 分别指向的每个字符:只需delete[] m_buffer,或者更好 - 使用std::string 按价值.
  • @juanchopanza: char ??? ...我正在使用std::ifstream 读取文件并声明m_buffer = new char[m_size]
  • @IAbstract:您的理解是错误的:实际指针m_buffer 应该在包含它的对象时被释放,无论是因为它是一个超出范围的局部变量还是因为它是一个动态分配的变量deleted;无论哪种方式,您都不必分离释放包含m_buffer 的类的每个数据成员。 “不是单独的指针” - 为什么是指针s 复数? m_buffer 表面上是一个指向 char 数组的指针。

标签: c++ arrays pointers gcc destructor


【解决方案1】:

如果m_buffer 是一个数组,那么只需使用:

delete [] m_buffer;

无需单独删除其元素。

【讨论】:

  • “没有必要……”,这样做会出错。
  • @juanchopanza Rigth。用词错误:)
【解决方案2】:

delete 旨在释放由 new 分配的对象。所以重要的问题是,你如何分配m_buffer? 在您当前的代码中,它似乎是一个数组,因为您遍历一个数组的元素并将每个元素强制转换为char *,然后再删除它。 如果你用new m_buffer[m_size]分配m_buffer,那么正确的方法是delete[] m_buffer

【讨论】:

    猜你喜欢
    • 2012-03-04
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2022-12-11
    相关资源
    最近更新 更多