我有一个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;
}
答案 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是一个类,则不会调用构造函数。