如何解决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
注意:
代码中剩下的唯一重新解释对象位于:
std::memcpy(&buffer[sizeHeader],sizeData);
可能对于OP这样的用例来说,对于char
(以及类似的类型,例如unsigned char
)有一些关于重新解释广播的特定例外。
来自cppreference.com: reinterpret_cast conversion:
,AliasedType为
std::byte
(自C ++ 17起),char
或unsigned 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 举报,一经查实,本站将立刻删除。