有一个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; }

最佳答案

第一个版本将一个指针设置为另一个指针。结束。

第二个版本分配一个指针引用的C样式字符串并将其复制到另一个内存缓冲区中,然后将第二个指针设置为指向它。

这样做的原因有很多,它们直接与类和所有权的概念联系在一起。

在第一种情况下,如果原始指针指向的任何内存被释放/破坏,则取消引用现在无效的指针将成为未定义的行为。

在第二种情况下,该类具有其自己的原始文本字符串副本,但仍然有效。当然,为了避免内存泄漏,当类实例被销毁时,它也应该销毁它最初分配的内存缓冲区。您应该在负责销毁此类实例的任何代码中看到这种情况。

关于c - 用C实现类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57024221/

10-15 18:59