Ir ao conteúdo
  • Cadastre-se

C++ Construtor causando crash na aplicação


cyer

Posts recomendados

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
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...