Форум программистов, компьютерный форум CyberForum.ru

Байтовое хранилище данных - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Ошибка при построении Release в VC 2010 Express. http://www.cyberforum.ru/cpp-beginners/thread557759.html
Использую qt-win-opensource-4.8.1-vs2010 с VC 2010 Express. Проект разделён на три файла: mainwindow.h #include <QtGui> #include <QtCore> class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); };
C++ Структура и кое-что не понятно... Имеется такая структура struct Person { std::string surname; unsigned int year; bool operator < (const Person &sg) { return (this->year < sg.year); http://www.cyberforum.ru/cpp-beginners/thread557736.html
Найти все элементы, кратные 3 или 5. Сколько их? C++
Одномерные массивы, помогите исправить ошибки #include "stdafx.h" #include <iostream> #include <conio.h> #include <math.h> using namespace std; void main () { int m, i, s=0; for (i=0; i<20; i++)
C++ Написать программу, которая бы по введенному номеру единицы измерения (1-секунды, 2-минуты, 3-часы, 4-сутки) и заданному временному интервалу печатала
Написать программу, которая бы по введенному номеру единицы измерения (1-секунды, 2-минуты, 3-часы, 4-сутки) и заданному временному интервалу печатала бы соответствующее значение в минутах.
C++ Помогите пожалуйста))) http://www.cyberforum.ru/cpp-beginners/thread557696.html
Даны действительные числа a,b,c. Удвоить эти числа, если a>=b>=c, и заменить их абсолютными значениями ,если это не так.
C++ splipath Есть задание - написать программу, выводящую путь, откуда запущена программа. При чем путь надо разбить. Ну там логический диск, директория, имя файла, расширение и тд. Запускать надо с консоли) Сделал так: #include <direct.h> #include <stdlib.h> #include <stdio.h> #include <string.h> int main( void ) { char path_buffer; подробнее

Показать сообщение отдельно
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
24.04.2012, 23:49     Байтовое хранилище данных
3BEPb_TyTa, std::string - это non-POD-тип. Если не вдаваться в подробности, это значит, что вы не можете так просто копировать его память.

std::string (или, строго говоря, std::basic_string<char>), имеет внутренний указатель на массив этих самых char. При создании объекта этого типа, этот массив выделяется и его адрес записывается в этот указатель. При увеличении (изменении?) длины хранимой строки, массив перевыделяется, и указатель обновляется. Наконец, при уничтожении объекта, память этого массива освобождается. Не забывайте, что многие алгоритмы работают с копиями объектов, вызывая конструктор копирования.

Я глубоко подозреваю, что функция std::getline() в своём теле вызывает std::string::operator=, что приводит к перевыделению памяти под внутренний буфер. Хотя это уже детали конкретной реализации.

Таким образом, грубое копирование объекта non-POD типа, например, через memcpy, ведёт к неопределённому поведению.

Цитата Сообщение от http://en.cppreference.com/w/cpp/string/byte/memcpy
If the objects are not trivially copyable (scalars, arrays, C-compatible structs), the behavior is undefined.

Не по теме:

Единственное, что гарантируется (если мне не изменяет склероз) - это то, что CharTraits (char) по стандарту должен быть POD-типом, но это в данном случае бесполезно.



Указанный вами способ теоретически может работать с POD-типами, что вы видите на примере int, double и прочих. Хотя... Ваша программа точно так же обвалится, если сначала сделать копию C-структуры с указателем на строку, затем освободить эту строку, а затем вывести кусок памяти по указателю в копии.

Именно по-этому стоит пользоваться объектами с их конструкторами, деструкторами и прочими вкусностями.

В качестве способа хранения строки могу предложить хранение именно содержимого этого массива (доступен через std::string::c_str()).
 
Текущее время: 05:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru