Witam.
Mam taki kod:
#include <iostream>
#include <stdio.h>
#include <string>
#define SSIZE 100
struct m_struct {
int a;
std::string opis;
m_struct(std::string _name):opis(_name){}
~m_struct(){
std::cout << "Destruktor struktury " << opis << "!" << std::endl;
}
};
void funkcja1(m_struct **structTab)
{
int licznik = 0;
while(*(structTab+licznik))
{
std::cout << (*(structTab+licznik))->opis << std::endl;
licznik++;
}
return;
}
m_struct** funkcja2(m_struct **t)
{
return t;
}
m_struct** funkcja3()
{
m_struct **m = new m_struct*[SSIZE];
for(int i(0); i<SSIZE; i++){
*(m+i) = NULL;
}
m_struct *k1 = new m_struct("K1");
m_struct *k2 = new m_struct("K2");
m_struct *k3 = new m_struct("K3");
*(m+0) = k1;
*(m+1) = k2;
*(m+2) = k3;
/* ~~~ 4 ~~~ */
return m;
}
int main()
{
// new & delete
m_struct *structA = new m_struct("Struct A");
m_struct *structB = new m_struct("Struct B");
m_struct *structC = new m_struct("Struct C");
m_struct *structD = new m_struct("Struct D");
m_struct *structE = new m_struct("Struct E");
m_struct *structF = new m_struct("Struct F");
m_struct **table = new m_struct*[SSIZE];
for(int i(0); i<SSIZE; i++){
/* ~~~ 1 ~~~ */
*(table+i) = NULL;
}
*(table+0) = structA;
*(table+1) = structB;
*(table+2) = structC;
*(table+3) = structD;
*(table+4) = structE;
*(table+5) = structF;
funkcja1(table);
m_struct **t1;
t1 = funkcja2(table);
funkcja1(t1);
m_struct **t2;
t2 = funkcja3();
funkcja1(t2);
for(int i(0); i<SSIZE; i++)
delete *(table+i);
delete []table;
/* malloc & free */
m_struct *structA1 = new m_struct("Struct A1");
m_struct *structB1 = new m_struct("Struct B1");
m_struct *structC1 = new m_struct("Struct C1");
m_struct *structD1 = new m_struct("Struct D1");
m_struct *structE1 = new m_struct("Struct E1");
m_struct *structF1 = new m_struct("Struct F1");
m_struct **tab_s = (m_struct**)malloc(sizeof(m_struct) * SSIZE);
for(int i(0); i<SSIZE; i++){
/* ~~~~ 2 ~~~~ */
*(tab_s+i) = NULL;
}
*(tab_s+0) = structA1;
*(tab_s+1) = structB1;
*(tab_s+2) = structC1;
*(tab_s+3) = structD1;
*(tab_s+4) = structE1;
*(tab_s+5) = structF1;
funkcja1(tab_s);
/* ~~~ 3 ~~~ */
for(int i(0);i<SSIZE;i++)
free(*(tab_s+i));
free(tab_s);
return 0;
}
Będę wdzięczny za sprawdzenie powyższego kodu. Mam kilka wątpliwości odnośnie tego programiku:
- Tutaj chyba nie trzeba alokować pamięci operatorem new() ? Jeśli się mylę to proszę o poprawkę?
- Podobna sytuacja co wyżej z tym, że dotyczy malloc.
- Nie uruchamia się destruktor? Czy powinien?
- Kiedy zwolnić przydzieloną pamięć?
Gdyby były jakieś inne błędy (niebezpieczne miejsca) to proszę o informację na ten temat.