I was just messing around with passing pointers to functions to wrap my head around how it works and I came across some behavior that was unexpected. I have the following code:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <cmath>
#include <iomanip>
using namespace std;
struct t
{
    string x;
    string y;
};
void foo(t*);
int main()
{
    t* ts = new t[2];
    ts[0].x = "t1.x";
    ts[0].y = "t1.y";
    ts[1].x = "t2.x";
    ts[1].y = "t2.y";
    foo(ts); 
    cout << ts[0].x << endl;
}
void foo(t* s)
{
    delete[] s;
    s = new t[2];
    s[0].x = "FOO.X";
    s[1].y = "FOO.Y";
}
The output here, interestingly enough, is "FOO.X". I expected that since inside of foo, s is a copy of the pointer ts that when I delete[] s I effectively delete[] ts as they both point to the same address. Then s = new t[2]; should have no effect on ts. After foo returns, I should no longer have access to s or the array it points to and ts should point to who knows where. Am I missing somehthing?
Note: This is just a test project that I made where I constantly write and erase blocks of code to test different concepts. All the includes and using namespace std is for ease of use, and it is NOT code that I am writing for any sort of practical use, purely educational. Also, I am using MS VS 2013.
 
    