vector van pointer crash

Status
Niet open voor verdere reacties.

Westerland

Gebruiker
Lid geworden
27 jun 2011
Berichten
286
Ik ben net begonnen met het leren van c++ maar zit nu vast op een probleem.

Ik wil in een unordened_map (van boostlib) een vector van pointers naar objecten plaatsen maar het programma (een maya plugin) crashed.

Nu crashed het programma op het volgende gedeelte:

[cpp]

//create the specified amount of camera's per floor
for (unsigned floorIndex = 0; floorIndex < floorAmount; floorIndex++)
{
vector<char*> test;
DEBUG(MString("floorIndex = ") + floorIndex);
for (unsigned cameraIndex = 0; cameraIndex < cameraAmount; cameraIndex++)
{
Camera *cam = new Camera;
CameraData *data = new CameraData;

createCamera(status,cam,data,floorIndex,cameraIndex);

char * x = "test"
test.push_back(x);
}
}

[/cpp]

de vector<char*> test; is zoals de naam al aangeeft, een test vector. dit simuleerd ongeveer wat er in moet gebeuren.

zodra ik de test.push_back(x) weghaal, werkt het gewoon prima.

iemand enig idee waar het fout kan gaan ?

Maya crash report geeft het volgende aan:

//=====================================================
Maya Crash Report
//=====================================================

Exception code: C0000005: ACCESS_VIOLATION - illegal read at address 0xFFFFFFFF
Fault address: 77C43332 in C:\Windows\SYSTEM32\ntdll.dll
0001:00052332 Logical offset (see .map file for location)
 
Gaat het echt fout bij de push back, of op het moment dat je het weer probeert te poppen? Ik vermoed namelijk het laatste.

Het vermoed dat het probleem dat je hebt is, dat de pointer naar de data out of scope gaat op het moment dat je de loop verlaat. Je pointers wijzen dus naar geheugenadressen die al weer vrij zijn gegeven.
 
Op dit moment wordt de data niet gepopped nog, de plugin zit nu in de fase dat alleen de data in de goede containers gezet worden zodat andere classes deze data uiteindelijk kunnen manipuleren.

de "echte code " dat gebruikt wordt is als volgt:

[cpp]

CameraContainer *container = CameraContainer::getInstance();

//set the floor size
container->setFloorSize(floorAmount);

//create the specified amount of camera's per floor
for (unsigned floorIndex = 0; floorIndex < floorAmount; floorIndex++)
{
for (unsigned cameraIndex = 0; cameraIndex < cameraAmount; cameraIndex++)
{
Camera *cam = new Camera;
CameraData *data = new CameraData;

//create camera and parse the values in the CameraData object
createCamera(status,cam,data, floorIndex, cameraIndex);

//set the cameradata to the camera object
cam->setCameraData(data);

//add the camera object to the cameraContainer
container->addCamera(cam,floorIndex);

DEBUG("end for loop");
}
}

[/cpp]


in de container (inclusief een hoop log spul):

[cpp]

void CameraContainer::addCamera( Camera *cam, unsigned floor )
{
vector<Camera*> camPerFloor = _cameras.at(floor);
DEBUG("floor vector retrieved");
char* x = new char[200];
sprintf(x,"%p\n",cam);

Logger::Instance()->writeToLogFile(x);

camPerFloor.push_back(cam);
DEBUG(MString("push succesfull ") + x);

}

[/cpp]

als het volgende command uitgevoerd wordt in maya:

addCamera -a 5 -f 5 (5 camera`s per verdieping, waarbij -f inhoudt dat er 5 verdiepingen zijn)

crashed die op element 11

de laatste DEBUG voert die nog uit (de push succesfull) waarna de boel crashed
 
Laatst bewerkt:
"Push succesful 5" of "push succesful 1"?

In principe doet deze code erg weinig. Overigens is "FLOOR" volgens mij een reserved keyword?

_cameras.at(floor); lijkt me dan ook eh... verdacht. Voor de rest zou ik zelf even moeten testen maar het enige wat deze routine verder doet is een vector aanmaken, wat debug regels printen en de vector weer weggooien
 
wat bedoel je met push secceful 5 of push succesful 1 ? die debugregel heb ik gemaakt om het adres van de pointer uit te printen.
Verder is floor geen reserved keyword (anders zou die zoiezo niet 10 camera's pushen toch? )

de _cameras.at(floor) vraagt de vector op op basis van de key (heb in andere test sessie _cameras[floor] gebruikt, wat geen verschil uitmaakt).


verder zorgt regel 10 er toch voor dat de camera pointer ( camPerFloor.push_back(cam); ) in de vector gezet wordt ?

ik ben nu even bezig een stand alone test op te zetten om te kijken of ik dezelfde fouten krijg buiten de maya plugin om.
 
Ja maar de vector wordt na de routine wel weer weggegooid.

probeer eens:

Code:
vector<Camera*> camPerFloor = new vector<Camera*>;

Je pushed toch 5 cameras? krijg je 5 debugs of loopt het na de eerste push al vast?
 
In het test project dat ik gemaakt heb, werkt het wel. heel vaag :S

Ik heb wat informatie achterwegen gelaten. de unordered_map wordt boven de code dat ik geplaatst heb geinitialiseerd:

container->setFloorSize(floorAmount);

voert uit:

[cpp]

void CameraContainer::setFloorSize(unsigned size)
{
for (unsigned short index = 0; index < size; index++)
{
_cameras[index] = vector<Camera*>();
}
}

[/cpp]

in totaal moeten er 25 cameras gepushed worden (5 cameras per verdieping).
de eerste 2 verdiepingen (10 in totaal) geen perfect.

de addCamera methode was in eerste instantie zo:


het lijkt mij dat deze methode niet de vector weggooit maar simpelweg de pointer naar het camera object in de vector gooit ?

[cpp]
void CameraContainer::addCamera( Camera *cam, unsigned floorNumber )
{
_cameras[floorNumber].push_back(cam);
}
[/cpp]
 
Verder als je de plugin uitvoerd met het command om 5 cameras per verdieping met 2 verdiepingen uitvoerd ( 2 * 5 dus) dan werkt die wel goed.

Zou het iets te maken kunnen hebben met dangling pointers ofzo ?
 
Je maakt in regel 5 alleen een pointer naar vector. Je moet "NEW" toevoegen om het correct te instantieren.

In principe is je tweede code netter dan een nieuwe lokale vector aanmaken.
 
Ik ben er eindelijk uit :D (1.5 dag werk)

Het had te maken met de conversie van een Maya string (MString ) naar een character array. De maya string heeft alleen de mogelijkheid om een const char *



achteraf had het dus niks te maken met de map en vector, waarschijnlijk dat die conversie van const char * naar char * iets raar deed waardoor maya crashte
 
Laatst bewerkt:
:thumb: Ik vond het al vreemd. Hoewel je compiler wel degelijk had moeten zeuren om "floor" (tenminste ik gebruik de math library standaard) en een warning had moeten geven vanwege het niet gebruiken van "new" (volgens de guidelines).

Ik zou het gebruik van floor nog steeds afraden. Zodra je ooit de math library nodig hebt moet je alles renamen.
 
nou de compiler begon juist te zeuren als new bij zette.

[cpp]
unordened_map<unsigned, vector<Camera*>> map;
map[index] = vector<Camera*>();
[/cpp]

maar als ik de vector als pointer declareerde:
[cpp]
unorderend_map<unsigned,vector<Camera*> *> map;
map[index] = new vector<Camera*>();
[/cpp]

ik had idd al floor veranderd kwa benaming (wist niet van die math lib af) maar die gaan we ongetwijfeld nodig hebben, aangezien we veel met lineaire algebra moeten doen.

verder had ik nog een vraag, weet jij een goede (en betrouwbare) manier om van een const char * een char * te maken ?


*EDIT*

heb de const_cast gevonden :)
 
Laatst bewerkt:
de dooddoener btw :

[cpp]

char* c_camName = new char[cameraName.length()];
std::strcpy(c_camName,cameraName.asChar());

[/cpp]

nog steeds geen idee waarom maargoed het is opgelost xD
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan