我有一个包含几个向量的类,我不确定哪种方法是最好的,但是当我调用析构函数时,它们应该从内存中删除。
HEADER:
class Test
{
public:
Test();
~Test();
void AddString(char* text);
void AddString(string text);
private:
char * StringToCharPointer(string value);
vector<char*> *pVector;
}
CPP文件:
Test::Test()
{
};
Test::~Test()
{
vector<char*>::iterator i;
for ( i = pVector->begin() ; i < pVector->end(); i++ )
{
delete * i;
}
delete pVector;
};
char * Test::StringToCharPointer(string value)
{
char *pChar = new char[value.length()];
strcpy(pChar, value.c_str());
return pChar;
};
Test::AddString(char* text)
{
pVector->push_back(text);
};
Test::AddString(string text)
{
pVector->push_back(StringToCharPointer(text));
};
所以这里几乎是我使用的所有方法,但是出了什么问题?
答案 0 :(得分:7)
首先,i
是向量上的迭代器,它不是存储在向量中的指针。 *i
是存储在向量中的指针,因此如果您要删除任何内容,那么它应该是。
其次,delete *i
仅在*i
指向的对象分配了new
时才有效。不是new[]
,不是malloc,它不指向字符串文字。由于您没有说明您的数据是如何分配的,因此我们无法说明您是否正确地释放了数据。
您似乎应该使用std::vector<std::string>
。
更新更新的问题:
HEADER:
class Test
{
public:
Test();
~Test();
void AddString(const string &text);
private:
vector<string> mVector;
};
CPP文件:
Test::Test()
{
};
Test::~Test()
{
};
void Test::AddString(const string &text)
{
mVector.push_back(text);
};
答案 1 :(得分:0)
你的破坏代码看起来很好(虽然我猜你的意思是delete *i;
在第二个片段中,否则,ti甚至不会编译。
然而,你得到的错误表明你在你的载体中放了不好的东西。可以使用此类销毁代码插入到向量中的唯一char*
是new char
返回的值。特别是,您不得将文字("abc"
)或作为其他字符串(strtok(NULL, ":")
,strchr(str, ':')
的一部分的字符串插入其中。
答案 2 :(得分:0)
这是一个明显的问题:char *pChar = new char[value.length()];
。您正在执行new[]
但在析构函数中执行delete
调用未定义的行为。您应该使用delete[]
删除这些指针。但是使用delete[]
可能会给Test::AddString(char* text)
方法带来问题,因为您无法确定如何分配text
的内存,即使用new
或new[]
或{{1 }}。最简单的方法是使用Steve Jossep建议的malloc
。
答案 3 :(得分:0)
您似乎应该使用std::vector<std::string>
来缩短Steve Jessop的明智词语。
再详细说明一下:你说你想要“让内存分配更小”,但如果你不知道指针就听起来像是在错误的路上,如果我猜错了,请纠正我过早优化(通常是在这类问题中缺乏经验的开发人员的情况)。