Hallo,
Am 01.12.2011 20:39, schrieb Stefan Reuther:
> Robert Hartmann wrote:
>> Wenn in einem Konstruktor memmove [1] verwendet wird,
>> ist es sinnvoll std::bad_alloc zu werfen, wenn memmove
>> scheitert? Oder besser anders?
>
> 'memmove' tut kein Scheitern über den Rückgabewert kund, da es, richtig
> verwendet, nicht scheitern kann.
mhm ...
>
> # DESCRIPTION
> # This function moves LENGTH characters from the block of memory starting
> # at `*SRC' to the memory starting at `*DST'. `memmove' reproduces the
> # characters correctly at `*DST' even if the two areas overlap.
> #
> # RETURNS
> # The function returns DST as passed.
>
Also die einzige Möglichkeit, die ich sehe, dass "even if the two areas
overlap" funktionieren kann, besteht darin, dass memmove eine interne
Kopie von der angegebenen Anzahl N Bytes ab *SRC an eine dritte
_nicht überlappende_ Stelle vornimmt und von dort nach
*DST herüberschaufelt.
Wenn nun aber kein Platz mehr für N Bytes an der dritten Stelle ist,
dann müsste memmove tatsächlich scheitern, auch wenn genügend Platz
bei *DST "hinterlegt" wäre.
>> Test(const char* buffer, size_t size) :
>> b(NULL), s(0)
>> {
>> if((buffer)&&(size)){
>> this->s=size;
>> if(!(memmove(this->b, buffer, size)){
>> //Fehler bei memmove
>> throw std::bad_alloc;
>
> Dieses 'memmove' wird scheitern, und zwar üblicherweise mit eine
> Schutzverletzung, da du als Zieladresse NULL angegeben hast.
Also muss ich vor dem Memmove für b noch genug Speicher
bereit stellen, ich dachte irgendwie, dass Memmove mir den
Speicherbereich, sollte kein gültiger angegeben worden sein,
bereitstellt.
> Was willst du eigentlich mit dem Code bezwecken? Solltest du statt
> 'memmove' eher 'malloc' meinen, so ist die korrekte Reaktion natürlich
> ein 'throw bad_alloc'.
>
>
> Stefan
Gruß Robert