分配内存时如何修复此错误

how can I fix this error when allocating memory?

本文关键字:错误 何修复 内存 分配      更新时间:2023-10-16

下面的代码有一个错误,请帮助我如何解决它。我是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::vectorstd::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));