2011-06-03 62 views
0

我有一个T类型的数组,它作为指针参数传递给函数。 问题是,我无法正确地将新数据写入此数组,而没有在第二次尝试中获取内存违规。将自定义数组传递给函数的问题(C++)

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

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

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

谢谢,最大

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

你可以多加一点这个问题吗?究竟在哪里,它失败了?什么'read()'(没有参数)呢? – 2011-06-03 20:06:34

+0

无参数read()从文本文件中读取T成员,一次一个。 我的问题已解决,谢谢。 – max12345 2011-06-03 20:19:51

回答

2
*apBuf[i] = var; 

这被分析为,如果它被写:

*(apBuf[i]) = var; 

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

(*apBuf)[i] = var; 

*apBuf给你“的对象指向apBuf”,这是数组;那么您将获得数组的第i个元素。

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

+0

谢谢!该死,我试图解决这个问题好几个小时。多么美好的地方。 – max12345 2011-06-03 20:09:17

+0

我宁愿使用矢量 - 当然,但我写这个程序不是为了我自己,而是为了大学的任务。他们给严格的rools如何做到这一点。 – max12345 2011-06-03 20:13:20

+0

最好是学习正确的方法来编写代码,正确地编写代码,然后与你的教授们争论(至少,这就是我所做的,而且我学到了更多的东西,而不是盲目地跟随着我们规则)。 – 2011-06-03 20:15:04

0

你遇到的一个问题是你使用malloc而不是新的。如果T是一个类,构造函数将不会被调用。

+0

谢谢。会改变它。 – max12345 2011-06-03 20:14:18

1

那么,你用malloc分配数组,然后试图分配给它。这是未定义的行为,因为您必须构建对象。

哦,你应该真的真的考虑使用自拥有资源类,因为malloc和一般这种编程风格是可怕不安全。如果T的拷贝构造函数抛出一个异常呢?内存泄漏。只是例如。