2015-12-05 75 views
2

我創建了一個結構指針。併爲其分配值。我試圖打印分配給它的值。它抱怨未處理的異常訪問衝突寫入位置0xCDCDCDCD。這樣做有什麼問題?如何無一例外地完成這項任務?所有的未處理的異常訪問衝突寫入位置0xCDCDCDCD - 結構C++

StructCol.h 

#include "stdafx.h" 
#ifndef StructCol_H 
#define StructCol_H 

#include<string> 

using namespace std; 

struct ABC 
{ 
    string test; 
    int no; 

    void print() 
    { 
     cout << test << endl; 
     cout << no << endl; 
    } 
}; 

#endif 

StructTest2.cpp 

#include "stdafx.h" 
#include<conio.h> 
#include<iostream> 
#include<stdio.h> 
#include "StructCol.h" 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    ABC*abc = (ABC*)malloc(sizeof(ABC)); 
    abc->no = 47; 
    abc->test = "fyp"; 
    abc->print(); 
    //delete abc; 
    //abc->print(); 

    _getch(); 
    return 0; 
} 

回答

4

您的結構中包含std::string元素。這是一種需要在創建該對象時執行構造函數的類型。

你不能用malloc創建你的結構,因爲那個C函數不知道構造函數。

C++ newdelete表達式會做正確的事情。當然,你應該更喜歡使用智能指針而不是手動內存管理(或者根本不需要動態分配)。

快速的方式來解決你的代碼是用newdelete

ABC *abc = new ABC; 
... 
delete abc; 
0

首先,你應該使用的free()代替delete以釋放內存abc指向。

delete運營商只能與new運營商一起使用。

其次,由於使用delete之後的第二個打印語句,最可能出現此錯誤。

釋放某個位置的內存後,您不應該以任何方式訪問它,因爲操作系統可能會回收它,並且您可能無法再訪問它。 訪問衝突錯誤表示操作系統提供的防止未經授權的進程訪問內存的安全性。

+0

即使出題的正確建議 – Veena

1

不要使用malloc,請使用new ou std :: unique_ptr。 Malloc不會調用ABC構造函數,所以字符串構造函數也不會被調用。

+0

正確的描述 – Veena

相關問題