将自定义数组传递给函数的问题(c ++)

时间:2011-06-03 20:03:09

标签: c++ pointers operators operator-precedence

我有一个T类型的数组,我将其作为指针参数传递给函数。 问题是我无法正确地将新数据写入此数组,而不会在第二次尝试时出现内存冲突。

在这段代码中,我从文本文件中读取整数并将它们传递给函数(类型为T的模板类的一部分),以便将它们附加到数组中。

在我完成追加整数之后,我想在Main中使用相同的数组。

有人知道代码有什么问题吗?

谢谢,Max

template<class T> int CFile<T>::read(T **apBuf, int aNum)
{
int readCounter = 0;

*apBuf = (T*)malloc(sizeof(T)*aNum);


for (int i = 0; i<aNum; i++)
{
    T var = read();

    if (var == NULL)
    {
        if (isEof)
        {

            return readCounter;
        }
        else
        {
            perror ("Error Reading File - Insufficient var type");
            return -1;
        }
    }
    else
    {   
        *apBuf[i] = var;

        readCounter++;
    }
}



return readCounter;

}

3 个答案:

答案 0 :(得分:2)

*apBuf[i] = var;

这被解析为好像是这样写的:

*(apBuf[i]) = var;

这显然不是你想要的; apBuf是指向数组的指针;您将它视为指向数组的指针,并且您正在取消引用它的i元素。你的真正含义是:

(*apBuf)[i] = var;

*apBuf为您提供“apBuf指向的对象”,即数组;然后你获得数组的i元素。

那说,这很不寻常:为什么不将数据累积到std::vector<T>并从函数中返回?然后您不必担心显式动态内存管理。 (另外,T总是一个指针类型吗?如果没有,那么var == NULL没有意义。)

答案 1 :(得分:1)

好吧,你使用malloc来分配数组,然后尝试分配它。这是未定义的行为,因为您必须构造对象。

哦,你应该真的真的考虑使用自有资源类,因为malloc和这种编程风格一般都是不安全的。如果T的复制构造函数抛出异常怎么办?内存泄漏。仅举例来说。

答案 2 :(得分:0)

您遇到的一个问题是您使用malloc而不是new。如果T是一个类,则不会调用构造函数。