Como o std :: string em c ++ aloca memória? [fechadas]

4

Eu notei que a biblioteca de strings não requer um para alocar espaço antes de escrever a entrada / saída. Como a biblioteca de strings aloca essa memória dinamicamente, eu sei da palavra-chave 'new' em c ++ e 'malloc' em c, mas quando tento algo assim, meu programa pára de funcionar.

char* str = new char[strlen(str) + 1];
cin>>str;

não consigo fazer isso funcionar, como funciona a biblioteca de strings?

Eu também sei de vetores em C ++, mas não um grande fã de usá-los, gostaria de saber se há uma maneira de alocar memória dinamicamente sem ter que alocar um tamanho antes, algo próximo, mas não tão sofisticado quanto a string. h biblioteca.

Como a biblioteca de strings recebe entrada ilimitada do usuário sem que o programador especifique o tamanho do buffer?

    
por Hawk 12.08.2014 / 10:49
fonte

2 respostas

15

How does std::string in c++ allocate memory?

conforme necessário, de forma transparente para o usuário.

i know of the 'new' keyword in c++ and 'malloc' in c but when i try something like this, my program stops working.

char* str = new char[strlen(str) + 1];
cin>>str;

Bem ... sim; strlen conta os caracteres consecutivos no endereço fornecido até encontrar um zero. No seu caso, o endereço especificado não está definido (será definido após o strlen é avaliado), portanto você está efetivamente chamando o strlen com alguma entrada aleatória - não há como funcionar.

I also know of vectors in C++ but not a big fan of using them,

Você realmente realmente (realmente muito) deveria ser. Eles são um wrapper extremamente fino (leia-se: rápido) sobre a criação de blocos de memória contíguos dinâmicos (exatamente o que você está tentando resolver), que fornecem segurança de tipo, limites de memória, segurança e gerenciamento automático de memória.

i would like to know if there's a way to dynamically allocate memory without having to allocate a size before

Não.

something close but not as sophisticated as the string.h library.

O string.h não é capaz de alocar memória sem conhecer o tamanho. Ele calcula o tamanho toda vez que precisa alocar memória, a um custo de tempo de execução (usando, por exemplo, strlen quando necessário).

How does the string library get unlimited input from user without the programmer specifying buffer size?

Isso não acontece. O que ele faz (no pseudocódigo aproximado) é este:

  • calcula o tamanho da entrada (provavelmente solicitando a partir do vapor de entrada por meio de uma API)
  • calcula o novo tamanho que a string deve ter depois de ler
  • alocar memória (dependendo do novo tamanho), se necessário
  • copia dados na nova memória
  • excluir memória antiga e usar nova em vez disso (se alguma memória / valor antigo foi definida)
por 12.08.2014 / 14:12
fonte
4

Se você não é fã de std::vector , talvez não queira ouvir isso, mas, por padrão, funcionará praticamente como std::vector .

Quando um string lê um fluxo, é push_back de cada caractere. O que ele faz quando fica sem espaço é realmente definido pelo alocador que você usou para o string . O padrão será manter a duplicação, como acontece com os vetores.

Você pode mudar isso, é claro, alterando o alocador, mas parece que essa não é a sua pergunta. Não há como pré-alocar uma quantidade desconhecida de memória. Você só tem 3 opções: alocar nenhuma, alocar uma quantia fixa ou alocar uma quantia inicial e depois alterá-la dinamicamente conforme necessário. Strings e vetores fazem o último para que eles façam o que você esperaria, mas com o trade off que você pode alocar memória dependendo do tamanho exato da string.

    
por 12.08.2014 / 12:58
fonte

Tags