Поведение цепочки строк в VS2017 [дубликат]

Это связано с тем, что вы удалили adb.exe (это мог быть ваш антивирус, который удалил его), которые находились в инструментах платформы в папке sdk android.

Что вам нужно сделать, так это удалить текущие платформы-инструменты в программе менеджера sdk и снова установить его снова.

13
задан Kirill V. Lyadvinsky 5 August 2010 в 05:59
поделиться

5 ответов

23
ответ дан AnT 19 August 2018 в 01:23
поделиться

Выделение памяти с помощью malloc не вызывает никаких конструкторов. Не смешивайте выделение C-стиля с объектами C ++. Они не играют хорошо вместе. Вместо этого используйте оператор new для размещения объектов в коде C ++:

example *ex = new example;

Это более разумный код и вызовет конструктор std::string::string() для инициализации строки, которая исправит segfault, который вы используете видя. И не забудьте удалить его, когда вы закончите, чтобы освободить память и вызвать соответствующие деструкторы:

delete ex;
3
ответ дан John Kugelman 19 August 2018 в 01:23
поделиться

Для параметра class или struct, такого как ваш example, правильный ответ использует new не malloc() для размещения экземпляра. Только operator new знает, как вызвать конструкторы для struct и его членов. Ваша проблема вызвана тем, что элемент строки не был сконструирован.

Однако есть редкие случаи, когда важно, чтобы определенный патч памяти действовал так, как если бы он содержал экземпляр класса. Если у вас действительно есть такой случай, существует вариант operator new, который позволяет указать местоположение объекта. Это «размещение нового» и должно использоваться с большой осторожностью.

void *rawex = malloc(sizeof(example));  // allocate space
example ex = new(rawex) example();      // construct an example in it
ex->data = "hello world";               // use the data field, not no crash
// time passes
ex->~example();                         // call the destructor
free(rawex);                            // free the allocation

Используя новое место размещения, вы обязаны предоставить область памяти правильного размер и выравнивание. Не предоставление правильного размера или выравнивания приведет к таинственным вещам. Неправильное выравнивание обычно быстрее вызывает проблему, но также может быть загадочным.

Кроме того, с новым местом размещения вы берете на себя ответственность за вызов деструктора вручную и в зависимости от происхождения блока памяти, выпуская его своему владельцу.

В общем, если вы уже не знаете, что вам нужно место нового, вам почти наверняка не нужно. Он имеет законное использование, но есть неясные углы каркасов, а не повседневные события.

3
ответ дан RBerteig 19 August 2018 в 01:23
поделиться

Проблема в том, что malloc не вызывает конструктор example. Поскольку string обычно представляется как указатель на стек, это устанавливается равным нулю, и вы разыскиваете нулевой указатель. Вместо этого вам нужно использовать new.

2
ответ дан rlbond 19 August 2018 в 01:23
поделиться

вы не должны использовать

example * ex = (example *) malloc (sizeof (* ex));

, потому что какой sizeof (* ex) return равен размеру long или size int, что связано с тем, что вы скомбинируете окружающий. вы можете использовать следующий код:

example * ex = (пример *) malloc (sizeof (пример));

0
ответ дан 开机就好 19 August 2018 в 01:23
поделиться
  • 1
    Любой способ генерации размера будет работать. – Dennis Zickefoose 5 August 2010 в 06:35
  • 2
    Кто-то будет проголосовать за это, если вы не будете осторожны (поскольку это неправильно). – Martin York 5 August 2010 в 08:48
Другие вопросы по тегам:

Похожие вопросы: