如何为特定数量的字符串分配内存?

时间:2014-04-09 15:45:59

标签: c++ memory constructor allocation

我被赋予了编写像字典这样的东西的任务,而我为意义分配内存的方式只是在构造函数中分配100个含义,这非常合适。

然而,教授并不赞成这一点,他让我以一种为相关数量的意义分配记忆的方式重写代码。我基本上不知道如何做到这一点,构造函数将如何提前知道我将拥有多少含义?

你们会建议什么?我只发布了与问题相关的部分代码。

#include"expression.h"

//---------------------METHODS-------------------------------------------

Expression::Expression(int m_ctr)
{
    count_meanings = m_ctr; // Set the counter to 0
    meanings = new char * [100]; // Allocate memory for 100 meanings
}

Expression::~Expression()
{
    delete [] meanings; // Free the allocated memory
    delete [] word_with_several_meanings; // Free the allocated memory
}

void Expression::word(char *p2c)
{
    word_with_several_meanings = new char[strlen(p2c)+1];
    strcpy(word_with_several_meanings, p2c); // copy the string, method: DEEP copy
}

void Expression::add_meaning(char *p2c)
{
    meanings[count_meanings] = new char[strlen(p2c)+1];
    strcpy(meanings[count_meanings++], p2c); // copy the string, method: DEEP copy
}

char * Expression::get_word()
{
    return word_with_several_meanings;
}

char * Expression::get_meaning(int n_meaning)
{
    return * (meanings + n_meaning);
}

int Expression::get_total_number_of_meanings()
{
    return count_meanings;
}

int main(void)
{
    Expression expr;

    expr.word("bank");
    expr.add_meaning("a place to get money from");
    expr.add_meaning("a place to sit");

    cout << expr.get_word() << endl;

    for(int i = 0; i<expr.get_total_number_of_meanings(); i++)
        cout << " " << expr.get_meaning(i) << endl;

1 个答案:

答案 0 :(得分:3)

C ++ 这样做的方法是使用:

  • std::string存储单个字符串(而不是原始字符* C类字符串)
  • std::vector存储一系列字符串(例如&#34;含义&#34;在您的字典中)

因此,您可以在班级中拥有vector<string>数据成员,并且可以使用string动态地为其添加含义(即vector::push_back())。

如果您 - 由于某种原因 - 想要保持原始C级别,您可以使用linked list数据结构,在每个节点内存储原始C字符串指针,当您添加新含义时,可以创建指向该字符串的新节点,并将该节点添加到链接列表。具有这样的节点定义的单链表可能就足够了:

struct MeaningListNode 
{
    char * Meaning;                 // Meaning raw C string
    struct MeaningListNode* Next;   // Pointer to next meaning node, or nullptr for last
};

但是,坦率地说,vector<string>>方法对我来说似乎更简单,更好。