2009-05-13 2 views
0

Я пишу программу в C++ и по какой-то причине я получаю ошибку сегментации в следующей строке:что может быть неправильным: char * param = new char [200];

char* param= new char[200]; 

я пробовал различные варианты и даже пытался поставить до того, как

int* param= new int;//for no reason 

и такая же ошибка. Что я мог сделать, чтобы вызвать эту проблему?

Что может вызвать простое распределение памяти, подобное этому, чтобы дать проблемы.

Я бы включил остальную часть программы, но это более 1000 строк. Но не стесняйтесь спрашивать больше информации.

+4

Вам нужно будет включить код какого-то рода, так как эти строки кода в порядке. Возможно, уменьшите свою программу до минимально возможного, сохраняя при этом ошибку. –

+0

Какая ошибка, и получаете ли вы ее при попытке получить доступ к значениям? Как вы к ним обращаетесь? – stefanB

+0

Если вы счастливы разрешить t'internet в целом видеть ваш код, вы всегда можете отправить его в прошлый битв [http://pastebin.com/] –

ответ

2

Я бы сказал, что Нейл на правильном пути - это, вероятно, то, что вы попирали раньше, потому что его поймали.

Вы убедились, что:

  1. Все предыдущие распределения удалось.
  2. Вы не писались в конце или в начале любого массива (там есть a plethora of information and tools for bounds checking).

[Редактировать] В ответ на ваш комментарий о том, 4 Гб оперативной памяти, предположим, что вы код эффективно выполняет следующие функции:

unsigned int amountToAllocate = 0; 
amountToAllocate -= 1; 

int* someStorage = new int[amountToAllocate]; 

someStorage[0] = 5; 

... потому что amountToAllocate является unsigned int, она будет обернуть круглый к его максимальному значению (4294967295, если unsigned int s - 32 бит на вашем оборудовании). Таким образом, вы попытаетесь выделить 4294967295 * 4 байта (опять же, предположив, что int s - 32 бит для вас) ... который составляет ~ 4 * 4 ГБ, и он провалится и умрет от неприятной смерти.

+0

Почему предыдущие распределения не удались? У меня 4gb Ram !? Но если серьезно, мне нужно проверить успех, как в C? – Meir

+0

Да, вы должны * всегда * проверить, чтобы убедиться, что распределения произошли, если вы собираетесь полагаться на доступ к ним позже. –

+0

Альтернативный ответ - нет, это не стоит. Я отказался от проверки распределения памяти, когда VM стала распространенной (более 15 лет назад) и никогда не испытывала ни одной проблемы из-за неудачного распределения. – 2009-05-14 10:40:11

8

Вы производите выделение памяти & освобождение до этой точки? Если это так, вы, вероятно, испортили кучу. Невозможно диагностировать дальше, не видя больше кода.

+2

Правильно, особенно если, скажем, был один из этих массивов ранее выделенных, которые были освобождены, скажем, скалярным удалением вместо удаления массива. –

+0

Есть инструменты, которые вы можете использовать, чтобы помочь диагностировать это: electricfence, dlmalloc, valgrind (тяжелый, но потрясающий), вызов HeapValidate в Windows, Application Verifier в Windows и т. Д. – leander

+0

Я думаю, я попробую один из программы, которые вы упомянули. Я дам вам знать, как это происходит. – Meir

2

Так вы можете его использовать, я заменил char на int, чтобы хранить некоторые значения, например, но работает одинаково с char.

#include <iostream> 

using namespace std; 

int main() 
{ 
    int * param = new int[200]; 

    for (int i = 0; i < 200; ++i) param[i] = i; 
    for (int i = 0; i < 200; ++i) cout << param[i] << endl; 

    delete[] param; 

    return 0; 
} 
+0

Хороший пример, хотя я бы сказал, что проблема кроется в другом месте, поэтому необязательно все это полезно для поиска источника проблемы OPs. –

+0

Вы правы, но поскольку он не показывает нам никакого кода, он может использовать этот пример, чтобы сравнить использование с тем, что он делает, и поэтому сам найти проблему. – stefanB

+0

+1: Справедливая точка :-) –

1

Во-первых, убедитесь, что эта строка является проблемой. Что произойдет, если вы прокомментируете это? (или замените его на char *param = NULL)

Во-вторых, единственный способ, с помощью которого может возникнуть segfault, - это то, что раньше было неправильно. Что происходит до этого?

Если вы не можете показать нам соответствующие фрагменты кода, то это ваша проблема. Начните комментирование битов кода или иным образом изолируйте потенциальные неполадки. Рано или поздно вы сможете свернуть проблему до небольшого образца, который воспроизводит ошибку. В этот момент проблема (и решение) может быть очевидной, и если это не так, по крайней мере, у вас есть образец кода с разумным размером, чтобы показать нам.

+0

+1 Для деления и завоевания :-) –

0

I второй, что @jalf говорит. Вы ДЕЙСТВИТЕЛЬНО уверены, что это линия, которая является неисправной? Это очень маловероятно.

Ошибка сегментации происходит, когда вы пытаетесь получить доступ к памяти, к которой у вас нет разрешения. Поскольку вы не запрашиваете какую-либо конкретную память, а скорее позволяете «новому» распределению памяти получить ее для вас, проблема должна быть в другом месте.

Что вы действительно должны сделать, так это положить кучу инструкций печати в свой код. (Я предполагаю, что вам неудобно использовать отладчик?) Это позволит вам увидеть, как далеко доходит программа до того, как произойдет сбой. Удачи!

+0

Что вам нужно делать, если вам неудобно использовать отладчик, - это удобно, используя отладчик *;) – jalf

+0

lol- Я использую отладчик (встроенные кодовые блоки), и он работает до этой строки, а затем дает ошибку seg. Могут быть определенные функции отладчика, с которыми я не знаком, но я определенно использую его! – Meir

Смежные вопросы