VS 2010 中的 C++ 中的 static_cast 无法从 void* 转换为 size_t 错误
Posted
技术标签:
【中文标题】VS 2010 中的 C++ 中的 static_cast 无法从 void* 转换为 size_t 错误【英文标题】:static_cast cannot convert from void* to size_t error in C++ in VS 2010 【发布时间】:2012-04-30 09:46:09 【问题描述】:我有以下代码,但出现以下错误
错误 C2036:'void *':未知大小 错误 C2440:“static_cast”:无法从“void *”转换为“size_t”
一行
void *addr = static_cast <void*> (static_cast <size_t> (mem + bytesAlreadyAllocated));
我的问题是为什么我会遇到错误以及如何摆脱这些错误?
感谢您的帮助。
class MemoryChunk
public:
MemoryChunk (MemoryChunk *nextChunk, size_t chunkSize);
~MemoryChunk() delete mem;
inline void *alloc (size_t size);
inline void free (void* someElement);
// Pointer to next memory chunk on the list.
MemoryChunk *nextMemChunk() return next;
// How much space do we have left on this memory chunk?
size_t spaceAvailable() return chunkSize - bytesAlreadyAllocated;
// this is the default size of a single memory chunk.
enum DEFAULT_CHUNK_SIZE = 4096 ;
private:
// The MemoryChunk class is a cleaner version of NextOnFreeList. It separates the next pointer from
// the actual memory used for the allocated object. It uses explicit next and mem pointers, with no
// need for casting.
MemoryChunk *next;
void *mem;
// The size of a single memory chunk.
size_t chunkSize;
// This many bytes already allocated on the current memory chunk.
size_t bytesAlreadyAllocated;
;
MemoryChunk::MemoryChunk(MemoryChunk *nextChunk, size_t reqSize)
chunkSize = (reqSize > DEFAULT_CHUNK_SIZE) ? reqSize : DEFAULT_CHUNK_SIZE;
next = nextChunk;
bytesAlreadyAllocated = 0;
mem = new char [chunkSize];
void* MemoryChunk :: alloc (size_t requestSize)
void *addr = static_cast <void*> (static_cast <size_t> (mem + bytesAlreadyAllocated));
bytesAlreadyAllocated += requestSize;
return addr;
inline void MemoryChunk :: free (void *doomed)
【问题讨论】:
你忘了问问题。你想解释错误吗?你想要一个解决方法吗?您想知道错误信息是否正确,或者您的代码是否合法? 这并不是您问题的真正答案,但我认为您可以通过以下方式完成: void *addr = static_castvoid *
是未定义的行为。
转换为 char * 然后添加偏移量。
编译器抱怨的原因是您不能从指针 (void *) 向上转换为 size_t,因为一个不是另一个的子类型。为此,您必须使用 C 风格的未经检查的强制转换。
【参考方案1】:
表达式:
static_cast <size_t> (mem + bytesAlreadyAllocated)
使用未定义的大小类型 (void
) 应用偏移量。因为void
没有大小,所以程序格式不正确。
char*
是适合您在这种情况下使用的指针。例如:
`char* mem;`
// and
char* addr(mem + bytesAlreadyAllocated);
更新
所以在下面的程序中:
#include <iostream>
int main(int argc, const char* argv[])
const int array[3] = -1, 0, 1;
std::cout << *(array + 0) << ", "
<< *(array + 1) << ", " << *(array + 2) << "\n";
return 0;
输出为-1, 0, 1
。元素偏移量是根据数组元素的大小和类型应用的。 void
-- 大小不合适。
【讨论】:
是的。 5.7 列出了您可以添加到指针的所有法律案例。这不是其中之一。 你能详细说明一下吗?我是 C++ 类型转换的新手。谢谢! @venkysmarty 我扩展以演示您将如何克服该问题。正在进行另一个更新......以上是关于VS 2010 中的 C++ 中的 static_cast 无法从 void* 转换为 size_t 错误的主要内容,如果未能解决你的问题,请参考以下文章
VS2008 中的 C++ 项目有效,但在 VS2010 中无效
C++中的VS2010调试器,“unused=???”的意思或“未使用=0”