Optymalizacja, wersja Debug\Release

0
	virtual int OnNotify(std::string& buffer)
	{
          //Poniższy kod w wersji Debug działa bez problemu, w wersji Release wysadza program
          return OnNotify(bufptr.c_str(), type);

          //W wersji Release tak się nie da, muszę zrobić jawne przypisanie wskaźnika i przekazanie go
	  //const char* bufptr = buffer.c_str();
          //return OnNotify(bufptr, type);
	}
	virtual int OnNotify(const char* buffer)
	{
...

Nie mogę namierzyć opcji odpowiedzialnej w ustawieniach kompilacji.
2

Jeżeli coś działa w debug, a na release nie działa, to nie potrzebujesz optymalizacji tylko naprawienia błędu. Szczerze wętpię by jakaś opcja kompilacji naprawiła błąd. Wersja debugowa zapewne inaczej alokuje pamięć więc nie wchodzisz na pamięć, która nie została przydzielona, to dosyć częsty przypadek.
Poza tym, nie wiadomo co robi drugie OnNotify. Skoro oczekujesz pomocy to chociaż pokaż kod.

4

Poniższy kod w wersji Debug działa bez problemu, w wersji Release wysadza program

To jest oznaka, że gdzieś w kodzie kryje się undefined behavior. W trybie Release kopilator agresywniej analizuje kod i potrafi zignorować znaczną część kodu jeśli stwierdzi, że w pewnych warunkach kod się będzie wykonywał jedynie w przypadku, gdy w przyszłości lub przyszłości dojedzie do undefined behavior (brzmi dziwnie, ale naprawdę się tak dzieje, demo jak to dziła jest trudne i dość obszerne do pokazania).

Pokazałeś za mało kodu, a dalszy opis jest jakiś dziwny.

Dostarcz Minimalny Kompletny Reprodukowany Przykład. Najlepiej użyj jakiegoś kompilatora online.

Jeśli używasz gcc lub clang użyj address-sanitizer lub Undfined-behavior sanitizer, wtedy zlokalizujesz odpowiedni błąd, odpowiednie flagi to:

  • -fsanitize=address
  • -fsanitize=undefined
1

Tak dodatkowo, trzeba się mocno domyślać co chcesz przekazać w przykładzie.
Pierwsza funkcja przyjmuje przez referencję argument buffer, ale nigdy go nie używa. Użyta jest za to inna zmienna - bufptr. Wywołana zostaje też 2-argumentowa funkcja OnNotify, której nigdzie nie widzimy - nawet deklaracji.

taki przykład jest bezużyteczny, +1 dla wypowiedzi Marka, zrób MCVE.

1

Z własnego doświadczania dodam, że przeciążone metody wirtualne są bardzo kłopotliwe i zwykle nie mają sensu.

Wirtualność oznacza, że potrzebny jest polimorfizm, czyli pochodne nadpisują implementację.
Przeciążenia zwykle są po to, by łatwiej wywoływać jakś funkcjonalność z róznymi argumentami.
Obie rzeczy naraz powodują, że próba dodania jakiejś implementacji OnNotify wymaga nadpisywania również przeciążeń, co jest uciążliwe kłopotliwe i nie niesie żadnej wartości.

0

Co ci przeszkadza (lub kto zabrania) zrobić po ludzku?

    virtual int OnNotify(const char* buffer)
    {
          return OnNotify(bufptr, type);
    }

    virtual int OnNotify(std::string& buffer)
    {
0

Sorry
Faktycznie chciałem uprościć ten przykład i za dużo powycinałem...
Generalnie coś się ostro sypie ba Debug, już nawet to co wpisałem też nie funga, jak będę przy kompie dokładnie to opiszę

0

OnNotify generuje zdarzenia metodą callback, i niestety ktoś sobie zdefiniował metodę z niepoprawną listą parametrów (Delphi)
Na Debug przeszło na Release zaczęło szaleć - na szczęście się wszystko wyjaśniło.
Sorry za zamieszanie i dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1