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)