Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Anonymous
unregistriert
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
void CString::AllocBuffer(int nLen) // always allocate one extra character for '\0' termination // assumes [optimistically] that data length will equal allocation length { ASSERT(nLen >= 0); ASSERT(nLen <= INT_MAX-1); // max size (enough room for 1 extra) if (nLen == 0) Init(); else { CStringData* pData; #ifndef _DEBUG if (nLen <= 64) { pData = (CStringData*)_afxAlloc64.Alloc(); pData->nAllocLength = 64; } else if (nLen <= 128) { pData = (CStringData*)_afxAlloc128.Alloc(); pData->nAllocLength = 128; } else if (nLen <= 256) { pData = (CStringData*)_afxAlloc256.Alloc(); pData->nAllocLength = 256; } else if (nLen <= 512) { pData = (CStringData*)_afxAlloc512.Alloc(); pData->nAllocLength = 512; } else #endif { pData = (CStringData*) new BYTE[sizeof(CStringData) + (nLen+1)*sizeof(TCHAR)]; pData->nAllocLength = nLen; } pData->nRefs = 1; pData->data()[nLen] = '\0'; pData->nDataLength = nLen; m_pchData = pData->data(); } } void FASTCALL CString::FreeData(CStringData* pData) { #ifndef _DEBUG int nLen = pData->nAllocLength; if (nLen == 64) _afxAlloc64.Free(pData); else if (nLen == 128) _afxAlloc128.Free(pData); else if (nLen == 256) _afxAlloc256.Free(pData); else if (nLen == 512) _afxAlloc512.Free(pData); else { ASSERT(nLen > 512); delete[] (BYTE*)pData; } #else delete[] (BYTE*)pData; #endif } |
Anonymous
unregistriert
Zitat von »"Osram"«
Neuen Bereich mit new anlegen, Inhalt des alten in den neuen kopieren, alten freigeben.
Anonymous
unregistriert
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#ifndef _CSTR_H #define _CSTR_H class CStr { private: char* pStringData; public: CStr(); // Default Konstruktor CStr(const char*); // Konstruktor mit Parameter Pointer auf String ~CStr(); // Dekonstruktor char* getString(); // Liefert einen Zeiger auf den aktuellen String zurück void setString(const char*); // Setzt den Inhalt der String Klasse }; #endif |
Quellcode |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include "../include/CStr.h" #include <windows.h> CStr::CStr() { pStringData = new char[0]; } CStr::CStr(const char* pStr) { pStringData = new char[ sizeof(*pStr) ]; strcpy(pStringData, pStr); } CStr::~CStr() { delete pStringData; } char* CStr::getString() { return pStringData; } void CStr::setString(const char* pStr) { // Speicher neu reservieren delete this->pStringData; this->pStringData = new char[ sizeof(*pStr) ]; strcpy(this->pStringData, pStr); //MessageBox(0, pStr, "test", MB_ICONINFORMATION); } |
Quellcode |
|
1 2 3 |
CStr* pMeinString = new CStr(); pMeinString->setString("Hallo"); delete pMeinString; |
Zitat
Gehts also tatsächlich nicht anders?
Quellcode |
|
1 2 3 4 5 |
CStr::CStr(const char* pStr) { pStringData = new char[ sizeof(*pStr) ]; strcpy(pStringData, pStr); } |
Quellcode |
|
1 2 3 4 5 |
CStr::CStr(const char* pStr) { pStringData = new char[ strlen(*pStr) +1]; // +1 for the trailing \0 strcpy(pStringData, pStr); } |
Anonymous
unregistriert
Zitat
So wie ich das sehe, reservierst du doch nur Speicher für ein EIN-BYTE-CHAR-ARRAY, da die Größe der Dereferenz von pStr doch nur ein Byte beträgt, oder?
Zitat
nicht besser, was dann auch durch
..delete[] pStr;
gelöscht wird?
Werbeanzeige