【发布时间】:2015-05-16 15:46:41
【问题描述】:
我的程序中存在内存泄漏问题。 我使用 Valgrind 来检查内存泄漏,并进行了一些更改,我得到了大约 20 个错误或 40 个错误,但我仍然无法消除所有错误,也不知道如何消除。 而且我不能更改 main 函数中的代码,我必须适应它。 我无法将专业化更改为字符串! 问题是使用 char* 和内存管理的正确方法是什么。
规则:
主码不可更改
不要将 char* 打包到任何智能指针或其他类型中。
问题
使用 char* 和容器管理内存。
还有可能吗? 或者通常分配数组而不是容器更安全?
我的 char* 析构函数有什么问题?
我的主要功能:
#include <iostream>
#include "test.h"
#include <vector>
using namespace std;
int main()
{
char * cpt[]={"tab","tab2","tab3"};
test<char*> test1;
test1.addItem(cpt[1]);
char * item=test1.getItem(0);
item[0]='Z';
cout<<item<<endl;
return 0;
}
测试.h
#ifndef TEST_H
#define TEST_H
#include <vector>
using namespace std;
template<class T>
class test
{
public:
~test();
void addItem(T element){
elements.push_back(element);
}
T getItem(int i){
return elements[i];
}
vector<T> elements;
};
#endif // TEST_H
test.cpp
#include "test.h"
#include <iostream>
#include <cstring>
using namespace std;
template<>
char * test<char*>::getItem(int i)
{
/*char *nowy=new char(strlen(elements[i])+1);
//strcpy(nowy,elements[i]);
return nowy;
//with above code 39 errorr in Valgrind
*/
return elements[i]; // with this instead of above 19 errors in Valgrind
}
template<>
void test<char*>::addItem(char* element){
char * c= new char( strlen (element)+1);
strcpy(c,element);
elements.push_back(c);
}
template<>
test<char*>:: ~test(){
for( auto v: elements)
delete []v; //with this 20 errors
//delete v; instead of above line 19 errors;
}
【问题讨论】:
-
很抱歉不得不这么说,但老实说,这段代码已经够乱了,你不应该改变它——你应该把它扔掉并重新开始。我不确定您认为保留
main或避免string的确切原因,但是如果您真的必须使用string以外的其他内容,您仍然应该编写自己的字符串类,它可以合理地管理内存,然后创建一个向量。 -
关键是我不能改变main的内部,但是请指出其中的任何错误。下一条规则是不要使用任何类型的智能指针。
-
抱歉,没有。真正的重点是你不应该改变
main;你应该把它扔掉并重新开始。 -
问题是当 T 可以解析为指针或非指针类型时,模板会变得混乱,这就是您遇到的问题。您应该修改您的模板,使其也像 unique_ptr 那样接受一个删除器,但由于您无法更改 main,看起来您的测试类需要假设 T 是一个指针类型,并且在其析构函数中调用
delete[]在每个元素。 -
好吧,我忘了删除我的 for .主文件超出了我的范围。我只能包含文件。那么我的 char* 专用析构函数有什么问题?
标签: c++ templates memory-leaks char valgrind