分配内存时如何修复此错误
how can I fix this error when allocating memory?
下面的代码有一个错误,请帮助我如何解决它。我是C++初学者。
int main(int argc, char **argv)
{
image=malloc(3*1450*900*sizeof(char)); /* to ALLOCATE MEMORY required to SAVE the file */
some thing else....}
错误是:无法将类型为"void*"的值分配给类型为"char*"的实体
首先,在C++中,您应该使用 new / new[]
和 delete / delete[]
而不是 malloc()
。
更好的方法是使用 std::vector
: std::vector<char> image(3*1450*900);
如果你真的需要在C++中使用malloc()
,你需要强制转换返回值(malloc()
返回一个void*
):
image = (char*)malloc(3*1450*900*sizeof(char));
当然,在继续之前,请始终检查返回值。
为什么它不起作用和快速修复
代码不起作用的原因是,malloc()
返回一个无法隐式转换为char*
的void*
。因此,据说malloc()
不是类型安全的。您可以通过编写(char*)malloc(3*1450*900)
来显式转换返回的指针,但这有点丑陋。(顺便说一句,sizeof(char)
始终为 1。
更现代的方法
在现代C++中,您应该使用容器(如 std::vector<T>
)进行内存分配。另外:尽量避免函数和类之外的全局变量。这是我要写的:
int main()
{
std::vector<char> image( 3*1450*900 ); // automatically fills with zeros.
}
这样做的好处是,内存管理是自动完成的。销毁image
对象时,将释放分配的内存。
由于您使用的是C++,因此您应该使用 new[]
创建数组并使用 delete[]
删除它们。
int main(int argc, char **argv)
{
image = new char[3 * 1450 * 900];
// ... some code here? ...
// When you're finished with image:
delete[] image;
// ... some code here? ...
return 0;
}
如果您使用的是new[]
或new
运算符,则不需要sizeof
,但即便如此,我想提一下sizeof(char)
始终等于 1。
如果您使用的是 C++11(您应该使用!),那么将图像声明为unique_ptr<char[]>
可能更合适,以防止由于异常处理不当或只是忘记delete[]
而导致内存泄漏。
您在错误报告中看到的那样很清楚!您应该将"="运算符另一侧的所有内容都转换为 (char*)!
image=(char*)malloc(3*1450*900*sizeof(char));
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 当使用带有VS2019或VSCode的虚幻引擎4.24.2时,我如何修复这些错误的Intellisense错误
- 如何修复sfml c++代码编译错误
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 如何修复此错误:className::className的无效使用
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 修复未初始化的局部变量错误
- 类型为 "Bucket&"(未限定的 const 限定)的引用不能使用 "SortedList." 类型的值进行初始化 如何修复此错误?
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- 如何修复此特征矩阵反演溢出错误?
- 试图修复一个错误,该错误不会让我开始编程其余部分
- 如何修复输出日志中的"EnableInput can only be specified on a Pawn for its Controller"错误
- 如何修复无效的API密钥,IP或操作权限错误?
- 避免指针运算,修复叮当整齐错误
- 如何使用运行时检查错误来修复我的C 格斗游戏
- 矢量下标超出范围错误-如何修复此SPECIFIC错误
- 包错误需要修复
- 如何在程序中出现错误之前修复丢失';' '*'?