C++ c++;无法取消共享内存(无效)

C++ c++;无法取消共享内存(无效),c++,casting,cout,C++,Casting,Cout,情况就是这样 // I have created a buffer void *buffer = operator new(100) /* later some data from a different buffer is put into the buffer at this pointer by a function in an external header so I don't know what it's putting in there */ cout << buf

情况就是这样

// I have created a buffer
void *buffer = operator new(100)

/* later some data from a different buffer is put into the buffer at this pointer
by a function in an external header so I don't know what it's putting in there */

cout << buffer;
//我已经创建了一个缓冲区
void*buffer=新运算符(100)
/*稍后,来自不同缓冲区的一些数据被放在该指针处的缓冲区中
通过外部标题中的函数,所以我不知道它在那里放了什么*/
不能这样做:

char* buffer = new char[100];

std::cout << buffer; 
// at some point
delete[] buffer;
char*buffer=新字符[100];

std::cout您需要将其强制转换为
char*
重新解释强制转换(缓冲区)
。问题是
void*
表示任何内容,因此只打印th指针;当您将其强制转换为
char*
时,内存的内容将被解释为C样式的字符串

注意:使用
reinterpret\u cast
而不是C-style
(char*)
来明确您的意图,避免以后难以发现的细微错误

注意:当然,您可能会得到一个segfault,因为如果数据确实不是C样式的字符串,那么可能会访问与缓冲区无关的内存

更新:您可以首先将内存分配给
char*
缓冲区,这也会解决您的问题:您仍然可以调用第三方函数(
char*
隐式转换为
void*
,我认为这是第三方函数的参数类型),并且您根本不需要执行强制转换。最好的办法是将内存归零,并限制第三方函数将99个以上的*
sizeof(char)
字节复制到缓冲区中,以保留结尾
'\0'
C样式字符串终止符

执行以下操作:

// C++11
std::array<char,100> buf;
// use std::vector<char> for a large or dynamic buffer size

// buf.data() will return a raw pointer suitable for functions
//   expecting a void* or char*
// buf.size() returns the size of the buffer

for (char c : buf)
    std::cout << (isprint(c) ? c : '.');
/C++11
std::阵列buf;
//将std::vector用于较大或动态缓冲区大小
//data()将返回适合函数的原始指针
//应为空*或字符*
//size()返回缓冲区的大小
用于(字符c:buf)

std::cout如果你想一个字节接一个字节,你可以使用一个无符号的字符并对其进行迭代

unsigned char* currByte = new unsigned char[100];
for(int i = 0; i < 100; ++i)
{
    printf("| %02X |", currByte[i]);
}
unsigned char*currByte=新的unsigned char[100];
对于(int i=0;i<100;++i)
{
printf(“|%02X |”,currByte[i]);
}

这不是一个非常现代(甚至不是非常“C++”)的答案,但它会将其打印为十六进制值。

有没有理由不将缓冲区创建为char*,如果这是存储在其中的内容?char*几乎和void*一样通用,您至少可以打印it@MartinBeckett因为调用的外部函数需要一个空*来告诉你真相——在剧院或歌剧中进行角色扮演是个坏主意。你通常会得到一个女主角或女爵士@EdHeal-所有的都是字节,其他的都只是粉饰而已@马丁贝克特——你和玛格丽特·贝克特(英国工党议员)有亲戚关系吗?——反正我离题了。是的,计算机是用字节工作的。但是这些字节有语义-请看提问时间-这可能会让你感到有趣。如果
缓冲区
不是以空结尾的呢?不是真的,你可以把缓冲区当作一个字符数组,然后使用
复制
+
ostream\u迭代器
或其他什么东西。@Etienedemartel不需要以空结尾,因此,您可以使用std::copy(v.begin()、v.end()、std::cout)将向量复制到cout;而且向量的末尾没有以null结尾的字符。@johnathon当你传递一个普通的
char*
@Etienedemartel时,它需要一个字符,但正如你指出的,我推断,char*只不过是一个未包装的向量或字符串,如果你知道它的边界,你可以很容易地将它复制到coutAh,我明白了,C++风格静态映射是吗?为什么要从<代码>空洞*>代码>中,如果你可以避免<代码>空白>代码>,它不是静态的(即代码< STATICE-CASTE/<代码>),但是告诉编译器你想以完全不同的方式重新解释数据(并且可能会受到影响)。我明白你说的话,但是我看不出为什么OP不能在第一个地方有一个<代码> char < /Cux>数组。这只是C。这个代码中没有C++任何地方,甚至是C型的CAST:PYEP,它是代码> C <代码>(新添加的新的)。删除演员阵容,以防有人想知道托尼在演什么。
unsigned char* currByte = new unsigned char[100];
for(int i = 0; i < 100; ++i)
{
    printf("| %02X |", currByte[i]);
}