Kezdőoldal » Számítástechnika » Programozás » Van erről valahol bugjelentés...

Van erről valahol bugjelentés vagy cáfolat arra, hogy ennek így kell működnie?

Figyelt kérdés

Utána olvastam, már jó pár éve felhozták, de Visual Studio 2015 alatt ez még mindig hazavágja a programot: [link]


Valaki akinek hivatalos titulusa "Senior Google Searcher" belinkelhetné erről a dologról a Microsoft álláspontját, mert én hiába kerestem nem találtam.



2015. aug. 23. 06:09
 1/8 anonim ***** válasza:
Nem használok Microsoft fordítót, de a std::string használatához kellene az "#include<string>" Lehet tejesen más a hiba, csak észrevétel.
2015. aug. 23. 10:40
Hasznos számodra ez a válasz?
 2/8 anonim ***** válasza:

# 1/1 Időpont ma 10:40


Bár jó észrevétel, de a probléma nem ott van. Valamiért az MSVC nem szereti emplace_back-nél az önmagára hivatkozást.

2015. aug. 23. 12:02
Hasznos számodra ez a válasz?
 3/8 A kérdező kommentje:

Egész pontosan akkor nem szereti amikor új területet kell foglalni az emplace_back során, hogy elférjen az új elem. Az apró probléma ebben, hogy érvénytelen lesz a régi referencia, ezért összeomlik a program vagy memóriaszemét lesz az új elem értéke.


Itt könnyedén megfigyelhető:

v.emplace_back(10);

int &i = v[0];

v.emplace_back(v[0]);


Ha nem kell új területet foglalni úgy megy:

v.reserve(2);

v.emplace_back(10);

v.emplace_back(v[0]);

2015. aug. 23. 15:10
 4/8 anonim ***** válasza:

# 3/3 Időpont ma 15:10


Valóban, csak én másik szemszögből próbálkoztam. Ez például lefut:


std::vector<std::string> v;

std::vector<std::string> v2;


v.emplace_back("I hate bugs!");

v2.emplace_back("I hate bugs!");

v2.emplace_back(v[0]);


Míg ha bármikor (reserve nélkül, tehát valóban új memóriaterületfoglalásnál) "önmagára" hivatkozok, akkor lesz bibi. G++ lefordítja gond nélkül.

2015. aug. 23. 15:33
Hasznos számodra ez a válasz?
 5/8 anonim ***** válasza:

Keresgéltem egy kicsit. A kód hibás (nem definiált viselkedést eredményezhet) és a javítás, hogy push_back-et kell hívni, mivel a második emplace_back hívásnál átméreteződhet a vektor és a v[0] a korábbi területre mutathat pillanatnyilag és más érték kerülhet be a vektor-ba.


[link]

2015. aug. 23. 17:45
Hasznos számodra ez a válasz?
 6/8 A kérdező kommentje:

Igen, de igazán implementálhatnák úgy az emplace_back -et, hogy ha új területet kell foglalni akkor:


1: Lefoglalja az új területet.

2: Létrehozza az új terület végén a kapott értéket.

3: Átmásolja az előző elemeket.

4: Felszabadítja az előző területet.

5: A régi terület mutatóját az új területre rakja.


Ezzel szemben a Visual Studionál ugyan úgy működik ha kell foglalni területet ha nem:


1: Lefoglalja az új területet.

2: Átmásolja az előző elemeket.

3: Felszabadítja az előző területet.

4: Létrehozza az új terület végén a kapott értéket.

5: A régi terület mutatóját az új területre rakja.

2015. aug. 23. 18:30
 7/8 anonim ***** válasza:

Bárhogy is van megvalósítva az átméretezés után az iterátorok és a referenciák érvénytelenek lehetnek. Benne van a szabványban, hogy csak átméretezés nélkül maradnak a vektor referenciái érvényesek. Pont a fenti kódban kellene lemásolni a v[0] elemét és a másolatot beadni. Eleve másolás történne, teljesen felesleges próbálkozás ezt elrejteni.


"Remarks: Causes reallocation if the new size is greater than the old capacity. If no reallocation happens,

all the iterators and references before the insertion point remain valid. If an exception is thrown other

than by the copy constructor, move constructor, assignment operator, or move assignment operator of

T or by any InputIterator operation there are no effects. If an exception is thrown while inserting a

single element at the end and T is CopyInsertable or is_nothrow_move_constructible<T>::value

is true, there are no effects. Otherwise, if an exception is thrown by the move constructor of a

non-CopyInsertable T, the effects are unspecified."

[link]

2015. aug. 23. 20:17
Hasznos számodra ez a válasz?
 8/8 A kérdező kommentje:
De ha a régi tömb törlése előtt helyezi be a paraméterként kapott elemet az új tömbbe, akkor működne, ahogy a többi fordítónál is.
2015. aug. 23. 21:54

Kapcsolódó kérdések:




Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!