[英]dynamic memory allocation
這是如何使用指針存儲和管理動態分配的內存塊地址的示例
#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 ==========
怎么了?請幫忙
由於這是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;
我完全同意以前的答案-如果要在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");
...
如果您只想修復編譯錯誤...
更改此:
item=malloc(sizeof(struct Item));
至:
item=(item*)malloc(sizeof(struct Item));
和這個:
item->name=malloc(strlen(name)+1);
至:
item->name=(char*)malloc(strlen(name)+1);
在第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);
if (item->name=NULL){
必須成為if (item->name==NULL){
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.