动态内存分配

时间:2010-07-27 20:55:01

标签: c++

这里是指针如何用于存储和管理动态分配的内存块

的地址的示例
#include <iostream>
#include <stdio.h>
using namespace std;
struct Item{
    int id;
    char* name;
    float cost;
    };
   struct Item*make_item(const char *name){
        struct Item *item;
        item=malloc(sizeof(struct Item));
        if (item==NULL)
             return NULL;
        memset(item,0,sizeof(struct Item));
        item->id=-1;
        item->name=NULL;
        item->cost=0.0;

         /* Save a copy of the name in the new Item */
        item->name=malloc(strlen(name)+1);
        if (item->name=NULL){
            free(item);
            return NULL;
        }

        strcpy(item->name,name);
         return item;

        }

int main(){



     return 0;
}

但这是错误

1

>------ Build started: Project: dynamic_memory, Configuration: Debug Win32 ------
1>  dynamic_memory.cpp
1>c:\users\david\documents\visual studio 2010\projects\dynamic_memory\dynamic_memory.cpp(11): error C2440: '=' : cannot convert from 'void *' to 'Item *'
1>          Conversion from 'void*' to pointer to non-'void' requires an explicit cast
1>c:\users\david\documents\visual studio 2010\projects\dynamic_memory\dynamic_memory.cpp(20): error C2440: '=' : cannot convert from 'void *' to 'char *'
1>          Conversion from 'void*' to pointer to non-'void' requires an explicit cast
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

出了什么问题?请帮忙

4 个答案:

答案 0 :(得分:6)

由于这是C ++,您需要从malloc转换返回值,因为C ++不会自动将void *转换为T *

item=static_cast<Item *>(malloc(sizeof(struct Item)));

或者甚至更好,停止使用malloc并使用new代替,您无需投射:

item = new Item;
item->name = new char[strlen(name + 1)];

也就是说,如果您使用new,则需要使用delete免费:

delete[] item->name;
delete item;

此外,如果您使用new,默认情况下,运行时会通过抛出异常来通知您内存不足。虽然最好学习如何将异常作为临时停止间隙来处理,但您可以使用new的nothrow版本,以便在内存不足时返回0:

item = new (std::nothrow) Item;

答案 1 :(得分:2)

我完全同意以前的答案 - 如果要在C ++程序中使用它,那么就用C ++方式做。

试试这个:

#include <iostream>
using namespace std;
struct Item{
    int id;
    string name;
    float cost;
    Item(char *pName) : id(-1), name(pName), cost(0) {}
    };
// Look ma, no "make_item"!

然后,您将使用make_item:

    ...
    pItem = make_item("hoozit");
    ...

用以下代码替换该代码:

    ...
    pItem = new Item("hoozit");
    ...

答案 2 :(得分:0)

如果您只是想修复编译错误......

改变这个:

item=malloc(sizeof(struct Item));

要:

item=(item*)malloc(sizeof(struct Item));

和此:

item->name=malloc(strlen(name)+1);

要:

item->name=(char*)malloc(strlen(name)+1);

答案 3 :(得分:0)

第11行 item=malloc(sizeof(struct Item));
必须成为 item=(Item *)malloc(sizeof(struct Item));

第20行 item->name=malloc(strlen(name)+1);
必须成为 item->name=(char *)malloc(strlen(name)+1);

第21行 if (item->name=NULL){
必须成为 if (item->name==NULL){