In senso inverso. Prima si libera il puntatore, poi il puntatore a puntatore.
Il discorso "smartpointer di smartpointer" non ha senso. E come dire: una porta che chiude una porta.
Se fai fatica a comprendere gli smart pointer, rifletti sulla classe string e wstring. Se ci pensi bene anche loro sono smart pointer di un dato char* sottostante, eppure le usi senza preoccuparti di come è gestita la memoria di quel char*.
Lo smart pointer (a semantica condivisa) si comporta allo stesso modo: gli si affida la memoria senza preoccuparsi di come e quando è liberata.
Ho riscritto il tuo esempio usando gli shared_ptr (che saranno inclusi nel prossimo standard, ma di cui molti compilatori hanno l'impementazione anche adesso. L'unica differenza è nel namespace che qui ho trascurato, ma è ininfluente ai fini del discorso).
codice:
#include "stdafx.h"
#include "A.h"
#include "B.h"
#include <string>
#include <header_shared_ptr>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	shared_ptr<CA> c(new CA());
	c->processA();
	shared_ptr<CB> data = c->GetCB();
	shared_ptr<CC> cx = data->m_mappa[0];
	
	wstring str = cx->GetName();
	cx = data->m_mappa[1];
	str = cx->GetName();
	return 0;
}
codice:
#pragma once
#include "B.h"
class CA
{
public:
	CA(void);
	~CA(void);
	void processA();
	shared_ptr<CB> GetCB();
private:
	shared_ptr<CB> m_b;
};

#include "StdAfx.h"
#include ".\a.h"

CA::CA(void)
{
}

CA::~CA(void)
{
}

void CA::processA()
{
	shared_ptr<CC> c(new CC());
	shared_ptr<CC> cx(new CC());
	c->SetName(L"giugio");
	cx->SetName(L"pippo");
	m_b.reset(new CB());
	m_b->processaB(c);
	m_b->processaB(cx);
}

shared_ptr<CB> CA::GetCB()
{
	return m_b;
}
codice:
#pragma once
#include "C.h"
#include <map>

using namespace std;

class CB
{
public:
	CB(void);
	~CB(void);
	void processaB(const shared_ptr<CC>& pPointer);
	map<int, shared_ptr<CC> >m_mappa;
};

#include "StdAfx.h"
#include ".\b.h"

CB::CB(void)
{
}

CB::~CB(void)
{
}

void CB::processaB(const shared_ptr<CC>& pC)
{
	m_mappa[m_mappa.size()] = pC;
	
}
codice:
#pragma once
#include <string>

using namespace std;
class CC
{
public:
	CC(void);
	~CC(void);
	void SetName(const wstring& str);
	wstring GetName() const;
private:
	wstring m_name;
};

#include "StdAfx.h"
#include ".\c.h"

CC::CC(void)
{
}

CC::~CC(void)
{
}

wstring CC::GetName() const
{
	return m_name;
}

void CC::SetName(const wstring& str)
{
	m_name = str;
}