It probably works without compression because you did something wrong with compression
You should really use smart pointers, see my
article about RAII. It makes your code simpler and safer. There's no reason to manage memory manually in C++...
As you see, the following code is shorter and doesn't need to explicitly deallocate anything.
std::unique_ptr<sf::Texture> Sprites::load(const std::string& path) {
PhysFsStream gfxStream;
gfxStream.open(path.c_str()); // <- shouldn't this be checked for errors?
// allocate buffer
const std::size_t size = 1024*1024*4;
std::unique_ptr<char[]> data(new char[size]);
gfxStream.read(data.get(), size);
// allocate texture
auto img = std::make_unique<sf::Texture>();
if(!img->loadFromMemory(data.get(), size))
return nullptr;
return img;
}