Brian Gradin
Brian Gradin

Reputation: 2275

C++ map insertion

// Create sound effect
SoundEffect* newSoundEffect = new SoundEffect(frequencyArray);

if (soundEffects.find(name) == soundEffects.end())
    soundEffects[name] = (*newSoundEffect);

// Clean up memory
delete [] frequencyArray;
delete newSoundEffect;

frequencyArray (above) and m_data (below) are dynamically allocated. soundEffects is a std::map. Whenever I try to insert the value pointed to by newSoundEffect into soundEffects, the destructor of SoundEffect is triggered, and for some reason, when the destructor tries to delete m_data, I get the error "Access violation reading location 0xCCCCCCCC. I read somewhere that this location denotes uninitialized memory or something. But in the code snippet above, using Visual Studio's debugger, I can confirm that m_data in newSoundEffect pointing to a valid memory sequence. What am I doing wrong?

~SoundEffect()
{
    if (m_data != NULL)
        delete [] m_data; // Error :(
}

EDIT: Owing to @Chad's suggestion, I went ahead and added a copy constructor to the SoundEffect class, but it hasn't helped, because although newSoundEffect is definitely constructed when I try to put it into soundEffects, the copy constructor receives an object with uninitialized member variables; an uninitialized SoundEffect.

Upvotes: 0

Views: 85

Answers (4)

Aesthete
Aesthete

Reputation: 18858

soundEffects[name] = (*newSoundEffect); is trying to put a copy of the SoundEffect object into the map.

I'm pretty sure you just want to store a SoundEffect* as the map value, instead of a SoundEffect object.

Upvotes: 0

selbie
selbie

Reputation: 104589

Short answer: Implement a copy constructor to copy the bytes of m_data appropriately (by reallocating a new buffer, and appropriately copying the bytes).

Another answer: Make your map a map of SoundEffect* (pointers) instead of SoundEffect instances. Don't delete newSoundEffect after inserting it into the map.

Upvotes: 0

Ed Heal
Ed Heal

Reputation: 60037

Need to see the constructor.

But 0xCCCCCCCC in microsoft world means it has not been allocated.

Upvotes: 0

Chad
Chad

Reputation: 19052

Your SoundEffect class will need a copy constructor and copy assignment operator to be used in this manner.

Read this: The rule of three

Upvotes: 1

Related Questions