Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
cyer

C++ Construtor causando crash na aplicação

Recommended Posts

Olá, estou escrevendo uma classe de string, estou tendo problemas com o meu próprio construtor, sempre que ele é chamado é ativado uma interrupção(INT3).

 

Estou utilizando o Visual Studio 2017.

#include <iostream>
#include <Windows.h>

namespace EH
{

class EHString
{
private:
	char*			m_sText;
	size_t			m_iLength;
	size_t			m_iMaxLength;
public:
	EHString(const char* Str) : m_iMaxLength(50), m_iLength(0)
	{
		// Alloca no heap o tamanho inicial para uma string
		this->m_sText = reinterpret_cast<char*>(HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, this->m_iMaxLength));

		// Pega o tamanho da string passada no construtor e copia para a classe
		for (; Str[this->m_iLength] != 0; this->m_iLength++)
		{
			// Verificação para evitar estouro de buffers
			if (this->m_iLength >= this->m_iMaxLength - 3)
			{
				this->m_iMaxLength *= 2;
				this->m_sText = reinterpret_cast<char*>(HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, this->m_sText, this->m_iMaxLength));
			}

			// Copia o caracter
			this->m_sText[this->m_iLength] = Str[this->m_iLength];
		}
		
		// Termina a string
		this->m_sText[this->m_iLength] = '\0';
	}

	EHString(EHString& estr) // Construtor que está causando o problema
	{
		*this = estr;
	}

	const char* c_str() const
	{
		return const_cast<const char*>(this->m_sText);
	}

	const size_t begin() const
	{
		return 0;
	}

	const size_t end() const
	{
		return this->m_iLength;
	}

	const size_t length() const
	{
		return this->m_iLength;
	}

	const size_t size() const
	{
		return this->m_iLength;
	}

	EHString& push_back(char ch)
	{
		// Verificação para evitar estouro de buffers
		if (this->m_iLength >= this->m_iMaxLength - 3)
		{
			this->m_iMaxLength *= 2;
			this->m_sText = reinterpret_cast<char*>(HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, this->m_sText, this->m_iMaxLength));
		}

		// Insere o caracter na ultima posição
		this->m_sText[this->m_iLength] = ch;
		
		// Termina a string
		this->m_sText[++this->m_iLength] = '\0';

		return *this;
	}

	EHString& append(char ch)
	{
		return this->push_back(ch);
	}

	EHString& append(const char* str)
	{
		for (size_t i = 0; str[i] != 0; i++)
			this->push_back(str[i]);

		return *this;
	}

	void pop_back()
	{
		this->m_sText[--this->m_iLength] = '\0';
	}

	bool operator==(const char* String)
	{
		char* tempText = this->m_sText;
		while (*tempText && (*tempText == *String)) tempText++, String++;
		return ((*reinterpret_cast<const unsigned char*>(tempText) - *reinterpret_cast<const unsigned char*>(String)) == 0);
	}

	bool operator==(EHString String)
	{
		return this->operator==(String.c_str());
	}

	EHString& operator=(const char* String)
	{
		this->m_iLength = 0;
		for (; String[this->m_iLength] != 0; this->m_iLength++)
		{
			// Verificação para evitar estouro de buffers
			if (this->m_iLength >= this->m_iMaxLength - 3)
			{
				this->m_iMaxLength *= 2;
				this->m_sText = reinterpret_cast<char*>(HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, this->m_sText, this->m_iMaxLength));
			}
			this->m_sText[this->m_iLength] = String[this->m_iLength];
		}

		this->m_sText[this->m_iLength] = '\0';
		return *this;
	}

	EHString& operator=(EHString String)
	{
		return this->operator=(String.c_str());
	}
};

}

int main()
{
    EH::EHString test("Testando uma string");
    EH::EHString test2(test);

    printf("%s - %i\n", test.c_str(), test.length());

    printf("%s - %i\n", test2.c_str(), test2.length());

    
    system("pause");

    return 0;
}

 

Editado por cyer
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

this é um ponteiro constante, não é possível fazer com que aponte outra variável. Se quer apontar outro objeto crie um ponteiro.

Editado por vangodp
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 25/02/2018 às 12:02, vangodp disse:

this é um ponteiro constante, não é possível fazer com que aponte outra variável. Se quer apontar outro objeto crie um ponteiro.

Obrigado, eu não lembrava que o ponteiro this era um ponteiro constante.

Editado por cyer
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×