Ir ao conteúdo
  • Cadastre-se
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;
}

 

  • 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.

  • 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.

  • 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

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
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

×