微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Reintepret强制转换和指针删除

如何解决Reintepret强制转换和指针删除

我在最近的实现中发现以下错误

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

...

ThreadPoolExecutor tpool = ..

这是删除指针的错误方法吗?

谢谢

解决方法

要解决基本问题,您需要一种方法来恢复原始指针p。由于您的标头是可变长度的,因此这意味着需要 end 一个长度,并且浮点数将需要直接跟随该长度(填充为零)。实现此零填充的一种可能解决方案是将长度存储为float(!)。然后,您可以将标题长度设为size_t(p[-1])

此外,在new[]中,您将需要额外的空间用于标题和对齐开销。

话虽如此,更简单的解决方案是

class Data {
  std::string header;
  std::vector<float> values;
};
,

这听起来有点像OP试图准备由标头和float序列组成的二进制数据。为了实现这一点(并克服M.Salters提到的对齐问题),我将使用std::vector<char>,将其大小调整为相应的大小。完整尺寸的预期二进制输出,然后std::memcpy()将内容(标头和浮点值)放入其中。

我的MCVE对此进行了演示:

#include <cstring>
#include <iomanip>
#include <iostream>
#include <string>
#include <vector>

int main()
{
  const std::string header = "FloatData";
  const float payload[] = { 1.0f,2.0f,3.0f };
  // determine binary size of header and payload
  const size_t sizeHeader = header.size();
  const size_t sizeData = sizeof payload;
  const size_t sizeTotal = sizeHeader + sizeData;
  // prepare binary buffer
  std::vector<char> buffer(sizeTotal);
  std::memcpy(&buffer[0],header.data(),sizeHeader);
  std::memcpy(&buffer[sizeHeader],(const char*)payload,sizeData);
  // dump binary buffer
  std::cout << "Buffer: " << buffer.size() << " Bytes,Dump:\n";
  for (unsigned char byte : buffer) {
    std::cout << ' ' << std::hex << std::setw(2) << std::setfill('0') << (unsigned)byte;
  }
  std::cout << '\n';
}

输出:

Buffer: 21 Bytes,Dump:
 46 6c 6f 61 74 44 61 74 61 00 00 80 3f 00 00 00 40 00 00 40 40

Live Demo on coliru

注意:

代码中剩下的唯一重新解释对象位于:

  std::memcpy(&buffer[sizeHeader],sizeData);

可能对于OP这样的用例来说,对于char(以及类似的类型,例如unsigned char)有一些关于重新解释广播的特定例外。

来自cppreference.com: reinterpret_cast conversion

AliasedType为std::byte(自C ++ 17起),charunsigned char:这允许将任何对象的对象表示形式检查为字节数组。

,

传递给>$('#Selector').autocomplete ƒ (options) { return new Autocomplete(this.get(0)||$('<input />'),options); } delete的值必须分别是delete[]new返回的值:

new[]

如果代码在float* p = new float[10]; // ... delete [] p; p之间修改了new的值,则行为是不确定的。

如果您需要根据delete[]的值使用不同的指针值,请执行获取该指针所需的任何操作,但您必须坚持使用原始p的“ strong”值,或者可以为删除而重新计算。也许像这样:

p

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。