有一个person(class)的构造函数。 为什么不
pObj->pFirstName = pFirstName;
pObj->pLastName = pLastName;
我不明白他这样写的目的。
pObj->pFirstName = malloc(sizeof(char)*(strlen(pFirstName)+1));
if (pObj->pFirstName == NULL)
{
return NULL;
}
strcpy(pObj->pFirstName, pFirstName);
两者之间有区别吗?
我没听懂
我没听懂
我没听懂
我没听懂
我不明白。
typedef struct _Person Person; //declaration of pointers to functions typedef void (*fptrDisplayInfo)(Person*); typedef void (*fptrWriteToFile)( Person*, constchar*); typedef void (*fptrDelete)( Person *) ; typedef struct _Person {
char* pFName;
char* pLName;
//interface for function
fptrDisplayInfo Display;
fptrWriteToFile WriteToFile;
fptrDelete Delete; }Person;
Person* new_Person(const char* const pFirstName,
const char* const pLastName); //constructor void delete_Person(Person* const pPersonObj); //destructor void Person_DisplayInfo(Person* const pPersonObj); void Person_WriteToFile(Person* const pPersonObj, const char* pFileName);
person* new_Person(constchar* const pFirstName, constchar* const pLastName) {
Person* pObj = NULL;
//allocating memory
pObj = (Person*)malloc(sizeof(Person));
if (pObj == NULL)
{
return NULL;
}
pObj->pFirstName = malloc(sizeof(char)*(strlen(pFirstName)+1));
if (pObj->pFirstName == NULL)
{
return NULL;
}
strcpy(pObj->pFirstName, pFirstName);
pObj->pLastName = malloc(sizeof(char)*(strlen(pLastName)+1));
if (pObj->pLastName == NULL)
{
return NULL;
}
strcpy(pObj->pLastName, pLastName);
//Initializing interface for access to functions
pObj->Delete = delete_Person;
pObj->Display = Person_DisplayInfo;
pObj->WriteToFile = Person_WriteToFile;
return pObj; }
答案 0 :(得分:2)
第一个版本将一个指针设置为另一个指针。结束。
第二个版本将一个指针引用的C样式字符串分配并复制到另一个内存缓冲区中,然后将第二个指针设置为指向它。
这样做的原因有很多,它们直接与类以及所有权的概念联系在一起。
在第一种情况下,如果原始指针指向的任何内存被释放/破坏,则取消引用现在无效的指针将成为未定义的行为。
在第二种情况下,该类具有其自己的原始文本字符串副本,但仍然有效。当然,为了避免内存泄漏,当类实例被销毁时,它也应该销毁它最初分配的内存缓冲区。您应该在负责销毁此类实例的任何代码中看到这种情况。
答案 1 :(得分:1)
如果仅分配指针,则结构包含指向调用者字符串的指针。如果调用者的字符串超出范围,或者调用者释放了它,则指针将不再有效。而且,如果他们修改了自己的字符串,它也会修改结构中的字符串。
制作字符串的副本可确保一旦将其放入结构中,就不会依赖于调用者的字符串。
答案 2 :(得分:0)
第一个仅对pFirstName / pLastName进行浅表复制
第二个进行硬拷贝。 -它在堆上分配另一个副本。